C# aspnet api版本控制:如果在调用api时提供了错误的api版本,为什么api返回200(ok)

C# aspnet api版本控制:如果在调用api时提供了错误的api版本,为什么api返回200(ok),c#,asp.net-core,.net-core,asp.net-core-mvc,swashbuckle,C#,Asp.net Core,.net Core,Asp.net Core Mvc,Swashbuckle,下面是使用的NuGet版本 PackageReference Include=“Microsoft.AspNetCore.Mvc.Versioning” Version=“2.3.0”包装参考 Include=“Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer” Version=“2.2.0”PackageReference Include=“Swashback.AspNetCore” Version=“3.0.0” startup.cs serv

下面是使用的NuGet版本

PackageReference Include=“Microsoft.AspNetCore.Mvc.Versioning” Version=“2.3.0”包装参考 Include=“Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer” Version=“2.2.0”PackageReference Include=“Swashback.AspNetCore” Version=“3.0.0”

startup.cs

 services.AddApiVersioning(o =>
            {
                o.ReportApiVersions = true;
                o.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
                o.AssumeDefaultVersionWhenUnspecified = true;
             o.ErrorResponses = new DefaultErrorResponseProvider();
            });
   [ApiVersion("2.0")]
        [ApiController]
        [Route("api/v{version:apiVersion}/[Controller]")]
        public class DemoTest : ControllerBase
        {
            [HttpGet]
            public IActionResult Get()
            {
                return new JsonResult(new { ResourceName = "DemoTestAPIController Version 2" });
            }
        }
DemostController.cs

 services.AddApiVersioning(o =>
            {
                o.ReportApiVersions = true;
                o.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
                o.AssumeDefaultVersionWhenUnspecified = true;
             o.ErrorResponses = new DefaultErrorResponseProvider();
            });
   [ApiVersion("2.0")]
        [ApiController]
        [Route("api/v{version:apiVersion}/[Controller]")]
        public class DemoTest : ControllerBase
        {
            [HttpGet]
            public IActionResult Get()
            {
                return new JsonResult(new { ResourceName = "DemoTestAPIController Version 2" });
            }
        }
对于上述控制器

[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
(此URL有效,其响应应为200,并按预期工作)

但是对于下面的URL,响应应该是400(禁止)。

以下是各api与SOINIG案例的预期响应。

一直尝试到现在: 我还尝试使用
MyErrorResponseProvider
覆盖DefaultError响应,但调试器根本没有命中它

借助于这个

MyErrorResponseProvider

class MyErrorResponseProvider : DefaultErrorResponseProvider
{
// note: in Web API the response type is HttpResponseMessage
public override IActionResult CreateResponse( ErrorResponseContext context )
{
       switch ( context.ErrorCode )
       {
           case "UnsupportedApiVersion":
               context = new ErrorResponseContext(
                   context.Request,
                   context.StatusCode,
                   context.ErrorCode,
                   "My custom error message.",
                   context.MessageDetail );
               break;
       }

       return base.CreateResponse( context );
}
}
下面的代码为我工作

我使用的是3.1.6版

<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="3.1.6" />
我的控制器

[ApiVersion("1.0")]
[ApiExplorerSettings(GroupName = "v1")]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
如果我尝试使用v2,我会得到这个错误

error: {
  code: "UnsupportedApiVersion",
  message: "The HTTP resource that matches the request URI 'http://localhost:61273/api/v2/values' does not support the API version '2'.",
  innerError: null
}

感谢您的快速响应,我意识到以下行缺少
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)这真神奇!