Я реализовал согласование содержимого, так что будет использоваться определенный сериализатор на основе заголовка 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, который будет приниматьприоритет над заголовком принятия.
Для этого я начал создавать подклассы 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.
Я просто не уверен, как правильно сопоставить поддерживаемые типы носителей или если есть лучшее, более простое решение для этого ...