在某些情况下,我想手动选择 MediaTypeFormatter。有没有办法做到这一点?
例如,如果用户代理是 Opera,总是以 JSON 格式返回数据
在某些情况下,我想手动选择 MediaTypeFormatter。有没有办法做到这一点?
例如,如果用户代理是 Opera,总是以 JSON 格式返回数据
当然,您可以创建自定义 MediaTypeMapping 并添加到格式化程序中。
下面的例子:
config.Formatters.JsonFormatter.MediaTypeMappings.Add(new UserAgentMediaTypeMapping("Chrome", "application/json"));
-----------------------------------------------------
public class UserAgentMediaTypeMapping : MediaTypeMapping
{
private string _userAgent;
public UserAgentMediaTypeMapping(string userAgent, string mediaType)
: base(mediaType)
{
//todo: error check
_userAgent = userAgent.ToLowerInvariant();
}
public UserAgentMediaTypeMapping(string userAgent, MediaTypeHeaderValue mediaType)
: base(mediaType)
{
//todo: error check
_userAgent = userAgent.ToLowerInvariant();
}
public string UserAgent
{
get
{
return _userAgent;
}
}
public override double TryMatchMediaType(HttpRequestMessage request)
{
HttpHeaderValueCollection<ProductInfoHeaderValue> agents = request.Headers.UserAgent;
foreach (ProductInfoHeaderValue pihv in agents)
{
if (pihv.Product != null)
{
if (pihv.Product.Name.ToLowerInvariant() == UserAgent)
{
return 1.0;
}
}
}
return 0.0;
}
}
我的旧博客文章( 1、2 )中与 con-neg 相关的更多信息:
当多个格式化程序匹配传入请求的条件时会发生什么?Conneg算法选择哪一个?
在 Conneg 算法运行期间,基于请求接受标头、Content-Type 标头、MediaTypeMapping 等一系列标准,总是有可能不止一个格式化程序在编写响应时指示其可用性。可以想象,Conneg 算法最终只能选择一种格式化程序。Default Conneg 算法具有以下优先顺序来选择最终格式化程序: