什麼是 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

資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP