ASP.NET Core中的状态码406(不可接受)

时间:2017-05-28 15:56:28

标签: asp.net-core

REST服务应该提供内容协商。这意味着客户端发送包含响应所需内容类型的Accept标头。如果服务不支持此媒体类型,则应使用状态码406(不可接受)进行响应。

我尝试将此行为映射到ASP.NET Core。如果ASP.NET核心无法识别Accept标头中的媒体类型,则它将返回JSON文档。在框架的先前版本中,可以通过在配置中添加特殊输出格式化程序来实现上述行为:

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

不幸的是,在RC1之后,HttpNotAcceptableOutputFormatter已从ASP.NET Core框架中删除。在当前版本的框架中是否有替代此类?

4 个答案:

答案 0 :(得分:20)

我之前有这个:

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

然后我将其更改为AddMvcCore()而不是AddMvc()

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

最后我在回复406中遇到了这个问题,所以我做的是将.AddJsonFormatters()添加到services.AddMVCCore(),我的API再次运行。

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

答案 1 :(得分:7)

在这种情况下,最好找到删除功能的提交,以查看它可能被替换的内容。在这种情况下,HttpNotAcceptableOutputFormatter已移除MvcOptions以修复this commit

  

更改内容协商算法,以便可以配置(通过MvcOptions)以始终遵循显式的Accept标头。

替换的内容是issue #4612,这是您在使用MvcOptions.ReturnHttpNotAcceptable添加MVC时配置的services.AddMvc(options => { options.ReturnHttpNotAcceptable = true; }); 设置。

所以你的代码应该是这样的:

<dependency
  <groupId>com.datuma.jbpm</groupId>
  <artifactId>HR</artifactId>
  <version>1.0</version>
</dependency>

答案 2 :(得分:3)

您可以将其添加到ConfigureService类中的Startup方法。

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

答案 3 :(得分:0)

以上答案均不适合我,最终此方法有效

在Startup.cs的ConfigureServices中添加以下行

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