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

How to get MvcOptions.ReturnHttpNotAcceptable to work together with ApiVersioning

如果请求的版本不受支持,我想 return 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
});

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

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

此外,如果我将 ApiVersionReader 设置为 HeaderApiVersionReader,并将 ReturnHttpNotAcceptable 设置为 true,则 return 是 HTTP 400 而不是 406 当版本不受支持。

如果我完全禁用版本控制,我会在 ReturnHttpNotAcceptable 设置为 true 的情况下正确获得 HTTP 406,如果请求有 appliction/xml 而 API 不支持 XML.

我在 ASP.NET API Versioning on Github 上问过这个问题,但我想知道这是否只是我没有弄清楚的问题,并且可以从这个论坛得到答案。

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

  • 我创建了一个输出格式化程序,它接受带有版本参数的媒体类型(例如 application/json;version=1.0application/vnd.acme+json;version=1.0
  • 我创建了 ApiVersioningDefaultErrorResponseProvider 的子类,因此当不接受在接受 header 中指定的版本时,它 returns HTTP 406。