我已经实现了内容协商,因此将基于accept标头使用特定的序列化器:
XmlFormatter fmtXml = new XmlFormatter();
fmtXml.SupportedMediaTypes.Add(new
System.Net.Http.Headers.MediaTypeHeaderValue("text/xml"));
JsonFormatter fmtJson = new JsonFormatter();
fmtJson.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
config.Formatters.Insert(0, fmtJson);
config.Formatters.Insert(0, fmtXml);
我需要允许客户端使用url参数指定所需的格式,该参数优先于accept标头。
为此,我开始对DefaultContentNegogiator进行子类化(尽管我不知道这是最好的主意。
public class CustomContentNegotiator : DefaultContentNegotiator
{
public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
string sMimeType = HttpUtility.ParseQueryString(request.Url.Query).Get("_format");
if (!string.IsNullOrEmpty(sMimeType))
{
...
}
else
{
return base.Negotiate(type, request, formatters);
}
}
}
然后我将默认的内容协商器替换为我的:
GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());
使用自定义内容协商程序的想法是,如果已将内容格式指定为url参数,则将找到匹配的格式程序,否则我将退回到DefaultContentNegotiator的行为。
我只是不确定如何在支持的媒体类型上正确匹配,或者是否有更好,更简单的解决方案...
答案 0 :(得分:0)
我确定使用自定义内容协商程序是一种红鲱鱼。相反,我能够使用MediaTypeMapping来匹配特定的url参数,而不是接受请求标头:
filter()