【问题标题】:Default "Accept" header value for Asp.Net Web APIAsp.Net Web API 的默认“Accept”标头值
【发布时间】:2019-01-25 19:50:54
【问题描述】:

如果在对 Asp.Net Web API 的请求中省略了 Accept 标头,服务器将返回 (415) Unsupported Media Type

我正在寻找一种方法来强制 API 在其标头中不包含 Accept 值时采用默认返回类型(在我的情况下为 application/json)。

经过大量阅读和搜索,我不确定这是否可能?

【问题讨论】:

    标签: asp.net asp.net-web-api http-accept-header


    【解决方案1】:

    当 HTTP Accept 标头丢失时,您可以强制框架使用 XML 格式化程序,方法是执行以下技巧:

    var jsonFormatter = config.Formatters.JsonFormatter;
    config.Formatters.Remove(config.Formatters.JsonFormatter);
    config.Formatters.Add(jsonFormatter);
    

    这样,JSON 格式化程序将是列表中第二个注册的格式化程序,而 XML 将是第一个。

    【讨论】:

      【解决方案2】:

      这是内容协商者的职责,可以选择正确的格式化程序来序列化响应对象。但默认情况下,如果找不到合适的格式化程序,WebApi 框架会获取JsonFormatter

      If there are still no matches, the content negotiator simply picks the first formatter that can serialize the type.

      所以这是奇怪的行为。无论如何,如果请求没有 Accept 标头,您可以设置自定义内容协商器以选择显式 JsonFormatter

      public class JsonContentNegotiator : DefaultContentNegotiator
      {
          protected override MediaTypeFormatterMatch MatchAcceptHeader(IEnumerable<MediaTypeWithQualityHeaderValue> sortedAcceptValues, MediaTypeFormatter formatter)
          {
              var defaultMatch = base.MatchAcceptHeader(sortedAcceptValues, formatter);
      
              if (defaultMatch == null)
              {
                  //Check to find json formatter
                  var jsonMediaType = formatter.SupportedMediaTypes.FirstOrDefault(h => h.MediaType == "application/json");
                  if (jsonMediaType != null)
                  {
                      return new MediaTypeFormatterMatch(formatter, jsonMediaType, 1.0, MediaTypeFormatterMatchRanking.MatchOnRequestAcceptHeaderLiteral);
                  }
              }
      
              return defaultMatch;
          }
      }
      

      并替换HttpConfiguration对象

      config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator());
      

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 2017-10-24
        • 1970-01-01
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多