什么是 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 returns XML
Accept: application/json returns 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

更新于: 2020-09-24

2K+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告