У меня есть проект веб-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
я хочу исключить исключение.
Как это сделать? Заранее спасибо!
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/
MethodOverrideHandler
со следующим кодом и изменил allMediaTypesRange
на мою спецификацию типа контента и ResponseMessage на UnsupportedMediaType
и это сработало! СПАСИБО