Код состояния 406 (недопустимый) в ядре ASP.NET

Услуги REST должны обеспечивать согласование контента. Это означает, что клиенты отправляют заголовок Accept, который содержит желаемый тип содержимого ответа. Если служба не поддерживает этот тип носителя, она должна отвечать кодом состояния 406 (не допускается).

Я пытаюсь сопоставить это поведение с ASP.NET Core. Ядро ASP.NET возвращает документ JSON, если он не распознает тип носителя в заголовке Accept. В предыдущих версиях структуры описанное выше поведение может быть достигнуто путем добавления в конфигурацию специального выходного форматирования:

public void ConfigureServices(IServiceCollection services) {
  services.AddMvc(options => {
    options.OutputFormatters.Insert(0, new HttpNotAcceptableOutputFormatter());
  });
}

К сожалению, HttpNotAcceptableOutputFormatter был удален из структуры ASP.NET Core после RC1. Есть ли замена для этого класса в текущей версии фреймворка?

Ответ 1

В таких случаях хорошей идеей будет найти коммит, который удалил функциональность, чтобы увидеть, чем он, вероятно, был заменен. В этом случае HttpNotAcceptableOutputFormatter был удален с помощью этой фиксации, чтобы исправить проблему # 4612:

Измените алгоритм согласования содержимого, чтобы его можно было настроить (с помощью MvcOptions) так, чтобы он всегда учитывал явный заголовок Accept.

Его заменили на MvcOptions.ReturnHttpNotAcceptable, который является настройкой в MvcOptions, которую вы настраиваете при добавлении MVC с помощью AddMvc.

Таким образом, ваш код должен выглядеть следующим образом:

services.AddMvc(options =>
{
    options.ReturnHttpNotAcceptable = true;
});

Ответ 2

У меня было это раньше:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}

Затем я меняю его на AddMvcCore() вместо AddMvc()

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore();
}

Наконец, у меня была эта проблема с Response 406, так что я сделал, чтобы добавить .AddJsonFormatters() в services.AddMVCCore() и мой API снова работал.

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvcCore()
        .AddJsonFormatters();
}

Ответ 3

Вы добавляете это в метод ConfigureService в классе Startup.

services.AddMvc(options =>
{
    options.ReturnHttpNotAcceptable = true;
    // If you need to add support for XML
    // options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});

Ответ 4

Ни один из приведенных выше ответов не сработал для меня, наконец, это сработало

Добавление следующей строки в ConfigureServices of Startup.cs

 public void ConfigureServices(IServiceCollection services)
 {
        services.AddMvcCore().AddJsonFormatters().AddApiExplorer();
 }