Форматировщики согласованного содержимого Web API с заголовком accept и параметром url - PullRequest
0 голосов
/ 16 апреля 2019

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

Я просто не уверен, как правильно сопоставить поддерживаемые типы носителей или если есть лучшее, более простое решение для этого ...

1 Ответ

0 голосов
/ 17 апреля 2019

Я определил, что использование посредника по пользовательскому контенту было красной селедкой.Вместо этого я смог использовать MediaTypeMapping, который сопоставляется с конкретным параметром URL вместо заголовка запроса на принятие:

fmtJson.MediaTypeMappings.Add(new System.Net.Http.Formatting.QueryStringMapping("_format", "json", "application/json"));
...