MediaTypeFormatter 基本資訊

MediaTypeFormatter 是一個抽象類,JsonMediaTypeFormatterXmlMediaTypeFormatter 類繼承自該類。這裡,JsonMediaTypeFormatter 類處理 JSON 物件,XmlMediaTypeFormatter 類處理 XML 物件。

無論 Accept Header 值如何,僅返回 JSON:

如果 application/jsonapplication/xmlWebApiConfig 類的 Register 方法中寫下以下行,則在請求的響應中僅返回 JSON 物件的天氣 Accept Header 值。

config.Formatters.Remove(config.Formatters.XmlFormatter);

在這裡,configHttpConfiguration 類的一個物件。這行程式碼完全刪除了 XmlFormatter,它強制 ASP.NET Web API 始終返回 JSON,而不管客戶端請求中的 Accept 標頭值如何。如果希望服務僅支援 JSON 而不支援 XML,請使用此技術。

無論 Accept Header 值如何,僅返回 XML:

如果 application/jsonapplication/xmlWebApiConfig 類的 Register 方法中寫下以下行,則在請求的響應中僅返回 XML 物件的天氣接受 Header 值請求。

config.Formatters.Remove(config.Formatters.JsonFormatter);

這裡,config 是如上所述的 HttpConfiguration 類的物件。這行程式碼完全刪除了 JsonFormatter,它強制 ASP.NET Web API 始終返回 XML,而不管客戶端請求中的 Accept 標頭值如何。如果希望服務僅支援 XML 而不支援 JSON,請使用此技術。

返回 JSON 而不是 XML:

  1. 從瀏覽器發出請求時,Web API 服務應返回 JSON 而不是 XML。
  2. 當從 fiddler 這樣的工具發出請求時,應該遵守 Accept 標頭值。這意味著如果 Accept 標頭設定為 application / xml,則服務應返回 XML,如果將其設定為 application / json,則服務應返回 JSON。

方法 1:

WebApiConfig 類的 Register 方法中包含以下行。

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

這指示 ASP.NET Web API 在為 text/html 發出請求時使用 JsonFormatter,這是大多數瀏覽器的預設設定。這種方法的問題是響應的 Content-Type 頭設定為 text/html,這是誤導性的。

方法 2:

使用自定義格式化程式建立一個派生自 JsonMediaTypeFormatter 類的類並實現 SetDefaultContentHeaders 方法。

以下是自定義 JSON 格式化程式類的示例,它返回 JSON 格式作為響應。

public class CustomJsonFormatter : JsonMediaTypeFormatter
{
    public CustomJsonFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
    {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

這是 Custom Media 型別格式化程式的示例,它返回 CSV 格式作為響應。

public class CSVMediaTypeFormatter : MediaTypeFormatter {

    public CSVMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
    }
    
    public CSVMediaTypeFormatter(MediaTypeMapping mediaTypeMapping) : this()
    {
        MediaTypeMappings.Add(mediaTypeMapping);
    }
    
    public CSVMediaTypeFormatter(IEnumerable<MediaTypeMapping> mediaTypeMappings) : this()
    {
        foreach (var mediaTypeMapping in mediaTypeMappings)
        {
            MediaTypeMappings.Add(mediaTypeMapping);
        }
    }
}

之後,實現自定義格式化程式類在 WebApiConfig 類的 Register 方法中註冊它。

config.Formatters.Add(new CustomJsonFormatter());

現在,根據你的格式化程式,你將從伺服器獲得響應和 Content-Type