如何让MvcOptions.ReturnHttpNotAcceptable与ApiVersioning一起工作

时间:2017-03-18 00:51:01

标签: asp.net-core api-versioning

如果不支持请求的版本,我想返回HTTP 406。所以我有:

services.AddApiVersioning(options =>
{
   options.ReportApiVersions = true;
   options.AssumeDefaultVersionWhenUnspecified = false;
   options.ApiVersionReader = new MediaTypeApiVersionReader();
});
services.AddMvc(options =>
{
   options.RespectBrowserAcceptHeader = true;
   options.ReturnHttpNotAcceptable = true;  // Return HTTP 406
});

但即使版本正确,这也总会返回HTTP 406(例如application / json; v = 1.0或application \ vnd.acme + json; v = 1)。

如果我将ReturnHttpNotAcceptable设置为false,则在不支持版本时会收到HTTP 400(错误请求),如果支持版本,则会收到HTTP 200.

此外,如果我将ApiVersionReader设置为HeaderApiVersionReader,并将ReturnHttpNotAcceptable设置为true,则在不支持该版本时,它会返回HTTP 400而不是406。

如果我完全禁用版本控制,我会正确获取HTTP 406,ReturnHttpNotAcceptable设置为true,如果请求有appliction/xml且API不支持XML。

我在ASP.NET API Versioning on Github上问了这个问题,但我想知道这是否是我想不到的,可以从这个论坛得到答案。

1 个答案:

答案 0 :(得分:0)

正如讨论here所示,我最终采用了这种方法:

  • 我创建了一个输出格式化程序,它接受带有版本参数的媒体类型(例如application/json;version=1.0application/vnd.acme+json;version=1.0
  • 我创建了ApiVersioning' s DefaultErrorResponseProvider的子类,因此当不接受Accept标头中指定的版本时,它会返回HTTP 406。