2017-03-18 460 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。