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框架中删除。在当前版本的框架中是否有替代此类?
答案 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();
}