Asp.Net webAPI C# 中的内容协商是什么?
内容协商是指在有多个可用表示形式的情况下,为给定响应选择最佳表示形式的过程。这意味着,服务器将根据请求中的 Accept 标头值发送响应。HTTP 中内容协商的主要机制是这些请求标头 −
Accept − 响应可接受哪些媒体类型,例如"application/json"、"application/xml"或自定义媒体类型,例如"application/vnd.example+xml"
Accept-Charset − 可接受哪些字符集,例如 UTF-8 或 ISO 8859-1。
Accept-Encoding −哪些内容编码是可接受的,例如 gzip。
Accept-Language − 首选的自然语言,例如"en-us"。
服务器还可以查看 HTTP 请求的其他部分。例如,如果请求包含 X-Requested-With 标头,表示 AJAX 请求,则如果没有 Accept 标头,服务器可能会默认使用 JSON。
在内容协商中,管道从 HttpConfiguration 对象获取 IContentNegotiator 服务。它还从 HttpConfiguration.Formatters 集合中获取媒体格式化程序列表。
接下来,管道调用 IContentNegotiator.Negotiate,并传入 −
- 要序列化的对象类型
- 媒体格式化程序集合
- HTTP 请求
Negotiate 方法返回两条信息 −
- 要使用的格式化程序
- 响应的媒体类型
如果没有找到格式化程序,Negotiate 方法将返回 null,并且客户端将收到 HTTP 错误 406(不可接受)。
我们考虑如下所示的 StudentController。
using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
public class StudentController : ApiController{
List<Student> students = new List<Student>{
new Student{
Id = 1,
Name = "Mark"
},
new Student{
Id = 2,
Name = "John"
}
};
}
}
RESTful 服务的标准之一是,客户端应该能够决定响应的格式——XML、JSON 等等。发送到服务器的请求包含一个 Accept 标头。客户端可以使用 Accept 标头指定响应的格式。例如
Accept: application/xml 返回 XML Accept: application/json 返回 JSON
以下输出显示,当我们将 Accept 标头设置为 application/XML 时,响应的格式为 XML。

以下输出显示,当我们将 Accept 标头作为 application/JSON 传递时,响应为 JSON 格式。

当响应以请求的格式发送到客户端时,请注意响应的 Content-Type 标头已设置为适当的值。例如,如果客户端请求了 application/xml,服务器将以 XML 格式发送数据,并设置 Content-Type=application/xml。

我们还可以指定质量因素。在下面的示例中,xml 的质量因子高于 json,因此服务器使用 XML 格式化程序并将数据格式化为 XML.application/xml;q=0.8,application/json;q=0.5


