2013-04-26 2 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; 
    } 
} 

Более подробная информация из моих старых постов в блоге (1, 2), связанных с кон-NEG:

Что происходит, когда несколько форматтеров соответствуют критериям входящего запроса в? Какой из них использует алгоритм Коннега?

Во время запуска алгоритма Conneg, основанного на наборе критериев, таких как заголовок запроса Accept, заголовок Content-Type, MediaTypeMapping и т. Д., Всегда существует вероятность, что более чем один форматировщик может указать его доступность при написании ответа. Как вы можете себе представить, алгоритм Коннега должен в конце выбрать только один форматировщик. Значение по умолчанию Conneg алгоритм имеет следующий порядок старшинства, чтобы выбрать окончательный форматировщик:

  1. Formatter матч, основанный на Media Type Mapping.
  2. Согласование форматирования на основе типа медиаконтента Accept Accept.
  3. Согласование форматирования на основе типа носителя заголовка Content Content-Type.
  4. Согласование форматирования на основе того, может ли он сериализовать тип данных ответа.
Смежные вопросы