2013-04-26 73 views
0

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

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

回答

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; 
    } 
} 

更多来自于与我的老博客文章(12)CON-NEG信息:

当多个格式化匹配传入的请求的标准会发生什么? Conneg算法选择哪一个?

在Conneg算法运行过程中,基于Request Accept头,Content-Type头,MediaTypeMapping等一系列条件,总有可能有多个格式化程序可能会在写入Response时指示其可用性。如你所想,Conneg算法最终只能选择一个格式化器。 默认Conneg算法具有以下优先顺序来选择最终的格式:根据媒体类型映射

  1. 格式化的比赛。
  2. 基于请求接受标头的媒体类型的格式符匹配。
  3. 基于请求内容类型头的媒体类型的格式符匹配。
  4. 格式化程序匹配是基于它是否可以序列化响应数据的类型。