2013-04-26 106 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. 格式化程序匹配是基於它是否可以序列化響應數據的類型。