如何让 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.0
或 application/vnd.acme+json;version=1.0
)
- 我创建了
ApiVersioning
的 DefaultErrorResponseProvider
的子类,因此当不接受在接受 header 中指定的版本时,它 returns HTTP 406。
如果请求的版本不受支持,我想 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.0
或application/vnd.acme+json;version=1.0
) - 我创建了
ApiVersioning
的DefaultErrorResponseProvider
的子类,因此当不接受在接受 header 中指定的版本时,它 returns HTTP 406。