aspnet-api-versioning: почему api возвращает 200 (нормально), если в вызове api указана неправильная версия Api

ниже используется версия NuGet.

PackageReference Include = "Microsoft.AspNetCore.Mvc.Versioning" Version = "2.3.0" PackageReference Include = "Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version = "2.2.0" PackageReference Include = "Swashbuckle.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();
            });

DemoTestController.cs

   [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" });
            }
        }

для вышеуказанного контроллера

http://localhost:53858/api/v2.0/DemoTest (этот URL действителен, и его ответ должен быть 200, и он работает, как ожидалось)

но для указанного ниже URL ответ должен быть 400 (запрещено). http://localhost:53858/api/v1.0/DemoTest

http://localhost:53858/api/v3.0/DemoTest

Ниже приведены ожидаемые ответы для соответствующих случаев api versoinig. Ответ об ошибке https://github.com/Microsoft/aspnet-api-versioning/wiki/Error-Responses

Пробовал до сих пор: я также пытался переопределить ответ DefaultError с помощью MyErrorResponseProvider, но отладчик вообще не сработал.

с помощью этого asnswer

services.AddApiVersioning(o =>
            {
                o.ReportApiVersions = true;
                o.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
                o.AssumeDefaultVersionWhenUnspecified = true;
             o.ErrorResponses = new MyErrorResponseProvider();
            });

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 );
}
}

person Arvind Maurya    schedule 15.10.2019    source источник


Ответы (1)


Ниже код работает для меня

Я использую версию 3.1.6

<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="3.1.6" />

Мой startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddApiVersioning(options =>
            {
                options.ReportApiVersions = true;
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.DefaultApiVersion = new ApiVersion(1, 0);
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

Мой контроллер

[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
}
person Tony Ngo    schedule 15.10.2019
comment
Спасибо за быстрый ответ, я понял, что отсутствует следующая строка services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); это творило чудо! - person Arvind Maurya; 15.10.2019