2017-03-18 246 views
0

如果所请求的版本不受支持,我想返回HTTP 406。所以,我有:如何让MvcOptions.ReturnHttpNotAcceptable与ApiVersioning一起工作

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(例如应用程序/ JSON; V = 1.0或应用\ 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上问了这个问题,但我想知道这是不是我想不出来的,并且可以从这个论坛得到答案。

回答

0

如在讨论中here指示的,我结束了这种方法:

  • 我创建接受的媒体类型与版本参数(例如application/json;version=1.0application/vnd.acme+json;version=1.0
  • 我创建的subsclass输出格式化ApiVersioningDefaultErrorResponseProvider,因此它在Accept头中指定的版本未被接受时返回HTTP 406。