Выдает исключение, когда Content-Type не указан

1

У меня есть проект веб-API, который возвращает некоторые данные о продуктах.

Если не указан заголовок Accept, он возвращает XML как значение по умолчанию, как это сделано в моем WebApiConfig:

config.Formatters.Clear();
config.Formatters.Add(new XmlMediaTypeFormatter());
config.Formatters.Add(new JsonMediaTypeFormatter());
config.Formatters.Add(new FormUrlEncodedMediaTypeFormatter());

Таким образом, по умолчанию используется XML, первый форматтер, но API по-прежнему поддерживает JSON, если запрос запрашивает его.

В моей ControllerHelper я добавил 415 формат не поддерживается ответ:

catch (FormatException) 
{
    var resp = new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType) 
    {
        Content = new StringContent(string.Format(HttpStatusCode.UnsupportedMediaType.ToString())),
    };
    throw new HttpResponseException(resp);
}

И я хотел бы передать этот ответ, если не указан заголовок Accept, поэтому необходимо установить его либо в application/xml, text/xml или application/json.

Например, если я тестирую установку accept в Advanced Rest Client для application/foo я хочу исключить исключение.


Изображение 174551


Как это сделать? Заранее спасибо!

  • 0
    Вы смотрели на запрос. Заголовки?
  • 0
    Возможно, я наткнулся на него в поиске ответа ... Вы должны указать его для каждого ActionResult в контроллере (ах) или каков наилучший подход? Благодарю.
Показать ещё 4 комментария
Теги:
asp.net-mvc
asp.net-web-api

1 ответ

2
Лучший ответ
public class NotAcceptableConnegHandler : DelegatingHandler
{
    private const string allMediaTypesRange = "*/*";

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var acceptHeader = request.Headers.Accept;
        if (!acceptHeader.Any(x => x.MediaType == allMediaTypesRange))
        {
            var hasFormetterForRequestedMediaType = GlobalConfiguration
                .Configuration
                .Formatters
                .Any(formatter => acceptHeader.Any(mediaType => formatter.SupportedMediaTypes.Contains(mediaType)));

            if (!hasFormetterForRequestedMediaType)
                return Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.NotAcceptable));
        }
        return base.SendAsync(request, cancellationToken);
    }
}

В файле WebApiConfig:

public static void Register(HttpConfiguration config)
{
    config.MessageHandlers.Add(new NotAcceptableConnegHandler());
}

Код от: http://pedroreys.com/2012/02/17/extending-asp-net-web-api-content-negotiation/

  • 0
    Спасибо за полезную ссылку. Я это проверю!
  • 0
    Это сработало для меня. Я создал MethodOverrideHandler со следующим кодом и изменил allMediaTypesRange на мою спецификацию типа контента и ResponseMessage на UnsupportedMediaType и это сработало! СПАСИБО

Ещё вопросы

Сообщество Overcoder
Наверх
Меню