Asp.net core 如何使mvcopions.returnHttpNotAccept与APVersioning一起工作

Asp.net core 如何使mvcopions.returnHttpNotAccept与APVersioning一起工作,asp.net-core,api-versioning,Asp.net Core,Api Versioning,如果请求的版本不受支持,我想返回HTTP 406。因此,我: services.AddApiVersioning(options => { options.ReportApiVersions = true; options.AssumeDefaultVersionWhenUnspecified = false; options.ApiVersionReader = new MediaTypeApiVersionReader(); }); services.AddMvc(o

如果请求的版本不受支持,我想返回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
});
但即使版本正确(例如application/json;v=1.0或application\vnd.acme+json;v=1),它也总是返回HTTP406

如果我将
ReturnHttpNotAcceptable
设置为false,那么当版本不受支持时,我将获得HTTP 400(错误请求),如果版本受支持,则获得HTTP 200

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

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


我已经问了这个问题,但我想知道这是否只是我还没有弄明白的问题,并且可以从这个论坛上得到答案。

正如讨论中所指出的,我最终采用了以下方法:

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