2

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

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

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

4

2 回答 2

2

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

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

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

于 2019-01-25T11:50:54.470 回答
1

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

如果仍然没有匹配,内容协商器只需选择第一个可以序列化类型的格式化程序。

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

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-07-27T22:44:34.730 回答