类型未指定
我有一个返回一些产品数据的Web 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
,我想抛出该响应。
例如,如果我测试将Advanced Rest Client中的accept设置为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/
链接地址: http://www.djcxy.com/p/20403.html下一篇: Give OData service document base URL a trailing slash in WebApi OData