0

在某些情况下,我想手动选择 MediaTypeFormatter。有没有办法做到这一点?

例如,如果用户代理是 Opera,总是以 JSON 格式返回数据

4

1 回答 1

1

当然,您可以创建自定义 MediaTypeMapping 并添加到格式化程序中。

下面的例子:

config.Formatters.JsonFormatter.MediaTypeMappings.Add(new UserAgentMediaTypeMapping("Chrome", "application/json"));

-----------------------------------------------------

public class UserAgentMediaTypeMapping : MediaTypeMapping
{
    private string _userAgent;

    public UserAgentMediaTypeMapping(string userAgent, string mediaType)
        : base(mediaType)
    {
        //todo: error check

        _userAgent = userAgent.ToLowerInvariant();
    }

    public UserAgentMediaTypeMapping(string userAgent, MediaTypeHeaderValue mediaType)
        : base(mediaType)
    {
        //todo: error check

        _userAgent = userAgent.ToLowerInvariant();
    }

    public string UserAgent 
    {
        get
        {
            return _userAgent;
        }
    }

    public override double TryMatchMediaType(HttpRequestMessage request)
    {
        HttpHeaderValueCollection<ProductInfoHeaderValue> agents = request.Headers.UserAgent;

        foreach (ProductInfoHeaderValue pihv in agents)
        {
            if (pihv.Product != null)
            {
                if (pihv.Product.Name.ToLowerInvariant() == UserAgent)
                {
                    return 1.0;
                }
            }
        }

        return 0.0;
    }
}

我的旧博客文章( 1、2 中与 con-neg 相关的更多信息

当多个格式化程序匹配传入请求的条件时会发生什么?Conneg算法选择哪一个?

在 Conneg 算法运行期间,基于请求接受标头、Content-Type 标头、MediaTypeMapping 等一系列标准,总是有可能不止一个格式化程序在编写响应时指示其可用性。可以想象,Conneg 算法最终只能选择一种格式化程序。Default Conneg 算法具有以下优先顺序来选择最终格式化程序:

  1. 基于媒体类型映射的格式化程序匹配。
  2. 基于请求接受标头的媒体类型的格式化程序匹配。
  3. 基于请求内容类型标头的媒体类型的格式化程序匹配。
  4. 格式化程序匹配基于它是否可以序列化响应数据的类型。
于 2013-04-26T18:02:14.877 回答