2017-05-28 394 views
1

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

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

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

不幸的是,HttpNotAcceptableOutputFormatter从RC1之后的ASP.NET核心框架去除。在当前版本的框架中是否有替代这个类的东西?

回答

4

在这种情况下,最好找到删除功能的提交,以查看它可能被替换的提交。在这种情况下,HttpNotAcceptableOutputFormatterthis commit移除以固定issue #4612

阿尔特内容协商算法,以便它可以(经由MvcOptions)被配置为总是遵守一个明确的Accept首部。

什么它被替换为MvcOptions.ReturnHttpNotAcceptable,这是对你有AddMvc加入MVC时配置MvcOptions的设置。

所以,你的代码应该变成这样:

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

你究竟发现了什么?! – Mardoxx

+2

@Mardoxx看着RC2分支和[找到文件](https://github.com/aspnet/Mvc/blob/1.0.0-rc2/src/Microsoft.AspNetCore.Mvc.Core/Formatters/HttpNotAcceptableOutputFormatter.cs )使用文件搜索(键盘快捷键:T)。这告诉我该文件最初位于何处。然后我去了[开发分支上的文件夹的历史记录](https://github.com/aspnet/Mvc/commits/dev/src/Microsoft.AspNetCore.Mvc.Core/Formatters),并使用“二进制搜索” GitHub UI找到删除文件的提交。 – poke

3

将此添加到Startup类中的ConfigureService方法中。

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

我不得不在此之前:

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(); 
}