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