В некоторых случаях я хочу вручную выбрать MediaTypeFormatter. Есть какой-либо способ сделать это?Расширение выбора MediaTypeFormatter
Например, если агент пользователя Opera, всегда возвращают данные в формате JSON
В некоторых случаях я хочу вручную выбрать MediaTypeFormatter. Есть какой-либо способ сделать это?Расширение выбора MediaTypeFormatter
Например, если агент пользователя Opera, всегда возвращают данные в формате JSON
Конечно, вы можете создать собственный 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 алгоритм имеет следующий порядок старшинства, чтобы выбрать окончательный форматировщик: