您的位置:首页 > 编程语言 > ASP

Asp.Net Web-api 不可多得的零基础教程9

2018-04-11 23:24 260 查看

通信协商

1.设置请求的Accept:application/json或者application/xml
2.设置Content-Type:application/json或者application/xml
3.Accept: application/xml;q=0.2, application/json;q=0.8 这种情况下,就返回q大的类型。

修改通信模式方式1:QueryStringMapping

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
    );
    config.Formatters.JsonFormatter.MediaTypeMappings.Add(
                                                            new QueryStringMapping("frmt", "json",
                                                            new MediaTypeHeaderValue("application/json")));
}
或者
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.XmlFormatter.MediaTypeMappings.Add(
                                                            new QueryStringMapping("frmt", "xml",
                                                            new MediaTypeHeaderValue("application/xml")));
}


config.Formatters.JsonFormatter.MediaTypeMappings .Add(

                new QueryStringMapping("frmt", "json",new MediaTypeHeaderValue("application/json"))
);
请求的时候使用:   http://localhost:55778/api/employees/12345?frmt=json  
这样即便指定Accept:也是不顶用的。返回的一定是json

修改通信模式方式2:RequestHeaderMapping

config.Formatters.JsonFormatter.MediaTypeMappings.Add(
                                                    new RequestHeaderMapping(
                                                                            "X-Media", "json",
                                                                            StringComparison.OrdinalIgnoreCase, false,
                                                                            new MediaTypeHeaderValue("application/json")));
GET http://localhost:12345/api/Demo/123 HTTP/1.1 Accept: application/xml
X-Media: json
Host: localhost:55778

RequestHeaderMapping 优先级比QueryStringMapping高。

修改通信模式方式3:MediaTypeMapping

public class IPBasedMediaTypeMapping : MediaTypeMapping
{
    public IPBasedMediaTypeMapping() :base(new MediaTypeHeaderValue("application/json"))
    {
     }
    public override double TryMatchMediaType(HttpRequestMessage request)
    {
        string ipAddress = String.Empty;
        if (request.Properties.ContainsKey("MS_HttpContext"))
        {
            var httpContext = (HttpContextBase)request.Properties["MS_HttpContext"];
            ipAddress = httpContext.Request.UserHostAddress;
        }
        else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
        {
            RemoteEndpointMessageProperty prop;
            prop = (RemoteEndpointMessageProperty)
            request.Properties[RemoteEndpointMessageProperty.Name];
            ipAddress = prop.Address;
        }
        return "::1".Equals(ipAddress) ? 1.0 : 0.0;
    }
}
config.Formatters.JsonFormatter.MediaTypeMappings.Add(new IPBasedMediaTypeMapping());
只要是Ipv6的Ip地址都可以。

重写返回类型:

public HttpResponseMessage Get(int id)
{
    var employee = list.FirstOrDefault(e => e.Id == id);
    return new HttpResponseMessage()
    {
        Content = new ObjectContent<Employee>(employee,
        Configuration.Formatters.JsonFormatter)
    };
}

修改通信模式方式3:MediaTypeMapping
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: