MediaTypeFormatter 基本信息
MediaTypeFormatter
是一个抽象类,JsonMediaTypeFormatter
和 XmlMediaTypeFormatter
类继承自该类。这里,JsonMediaTypeFormatter
类处理 JSON 对象,XmlMediaTypeFormatter
类处理 XML 对象。
无论 Accept Header 值如何,仅返回 JSON:
如果 application/json
或 application/xml
在 WebApiConfig
类的 Register
方法中写下以下行,则在请求的响应中仅返回 JSON 对象的天气 Accept Header 值。
config.Formatters.Remove(config.Formatters.XmlFormatter);
在这里,config
是 HttpConfiguration
类的一个对象。这行代码完全删除了 XmlFormatter
,它强制 ASP.NET Web API 始终返回 JSON,而不管客户端请求中的 Accept 标头值如何。如果希望服务仅支持 JSON 而不支持 XML,请使用此技术。
无论 Accept Header 值如何,仅返回 XML:
如果 application/json
或 application/xml
在 WebApiConfig
类的 Register
方法中写下以下行,则在请求的响应中仅返回 XML 对象的天气接受 Header 值请求。
config.Formatters.Remove(config.Formatters.JsonFormatter);
这里,config
是如上所述的 HttpConfiguration
类的对象。这行代码完全删除了 JsonFormatter
,它强制 ASP.NET Web API 始终返回 XML,而不管客户端请求中的 Accept 标头值如何。如果希望服务仅支持 XML 而不支持 JSON,请使用此技术。
返回 JSON 而不是 XML:
- 从浏览器发出请求时,Web API 服务应返回 JSON 而不是 XML。
- 当从 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
。