Значение заголовка "Принять" по умолчанию для веб-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());
Другие вопросы по тегам