2014-09-04 101 views
1

我有一个返回一些产品数据的Web API项目。未指定Content-Type时抛出异常

如果未指定任何接受头返回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); 
} 

而且我想抛出一个响应,如果没有指定接受头,因此要求它进行设置,无论是application/xml,text/xmlapplication/json

例如,如果我测试设置接受高级休息客户端application/foo我想抛出一个异常。


enter image description here


如何做到这一点?提前致谢!

+0

你看看request.Headers? – fuchs777 2014-09-04 08:57:59

+0

我可能在我的搜索答案中偶然发现了它。是否应该为控制器中的每个ActionResult指定它,或者什么是最佳方法?谢谢。 – urbz 2014-09-04 09:01:04

+0

尝试过滤网页API。在那里你可以解析你的头文件并获取内容类型并将异常/错误消息或watever返回给客户端。过滤器适用于所有操作。没有太多的经验,但看到它的工作。 – Savaratkar 2014-09-04 09:06:31

回答

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

感谢您的有用链接。我会看看! – urbz 2014-09-04 09:24:46

+0

这为我解决了。我使用以下代码创建了一个'MethodOverrideHandler',并将'allMediaTypesRange'改为了我的内容类型规范,并将ResponseMessage改为'UnsupportedMediaType',并且它工作正常!感谢:D – urbz 2014-09-04 09:44:33