Значение заголовка "Принять" по умолчанию для веб-API Asp.Net
Если пропустить Accept
заголовок в запросе к веб-API Asp.Net, который вернет сервер (415) Unsupported Media Type
Я ищу способ заставить API принять тип возвращаемого значения по умолчанию (в моем случае, application/json
) когда запрос не содержит Accept
значение в его заголовках.
После большого количества чтения и поиска, я не уверен, что это вообще возможно?
1 ответ
Вы можете заставить каркас использовать XML-форматер, если отсутствует заголовок HTTP Accept, выполнив следующий прием:
var jsonFormatter = config.Formatters.JsonFormatter;
config.Formatters.Remove(config.Formatters.JsonFormatter);
config.Formatters.Add(jsonFormatter);
Таким образом, форматер JSON будет вторым зарегистрированным форматером в списке, а XML будет первым.
Это возможность согласования содержимого выбрать правильный форматер для сериализации объекта ответа. Но по умолчанию WebApi Framework получает JsonFormatter
если не смог найти подходящий форматтер.
Так странное поведение. В любом случае вы можете настроить пользовательский контент-переговорщик, чтобы выбрать явный JsonFormatter
если запрос не имеет Accept
заголовок.
public class JsonContentNegotiator : DefaultContentNegotiator
{
protected override MediaTypeFormatterMatch MatchAcceptHeader(IEnumerable<MediaTypeWithQualityHeaderValue> sortedAcceptValues, MediaTypeFormatter formatter)
{
var defaultMatch = base.MatchAcceptHeader(sortedAcceptValues, formatter);
if (defaultMatch == null)
{
//Check to find json formatter
var jsonMediaType = formatter.SupportedMediaTypes.FirstOrDefault(h => h.MediaType == "application/json");
if (jsonMediaType != null)
{
return new MediaTypeFormatterMatch(formatter, jsonMediaType, 1.0, MediaTypeFormatterMatchRanking.MatchOnRequestAcceptHeaderLiteral);
}
}
return defaultMatch;
}
}
И заменить в HttpConfiguration
объект
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator());