【问题标题】:Throw exception when Content-Type is not specified未指定 Content-Type 时抛出异常
【发布时间】:2014-09-04 08:51:37
【问题描述】:

我有一个返回一些产品数据的 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 Format not supported回复:

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

如果没有指定 Accept 标头,我想抛出该响应,因此需要将其设置为 application/xmltext/xmlapplication/json

例如,如果我测试将 Advanced Rest Client 中的接受设置为 application/foo,我想抛出异常。



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

【问题讨论】:

  • 你看过 request.Headers 了吗?
  • 我可能在寻找答案时偶然发现了它。您应该为控制器中的每个 ActionResult 指定它还是最好的方法是什么?谢谢。
  • 在 web apis 中尝试过滤器。在那里您可以解析您的标头并获取内容类型并将异常/错误消息或水返回给客户端。过滤器适用于所有操作。没有太多经验,但看到它工作。
  • 我也没有@theinsaneone,感觉就像我在这里如履薄冰!感谢您的回复。如果有任何进展或类似情况,我会更新。
  • 你可以google一下web api中的动作过滤器。这将是解决您问题的正确方法

标签: c# xml asp.net-mvc asp.net-web-api


【解决方案1】:
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,它成功了!谢谢:D
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2013-05-24
  • 1970-01-01
  • 2015-08-31
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多