Управление версиями Web API 2 с помощью Microsoft.AspNet.WebApi.Versioning - PullRequest
0 голосов
/ 15 июня 2019

Я использую ASP.NET Versioning Library , я выполнил шаги, чтобы добавить эту библиотеку в очень простой проект ASP.NET Web API 2. Вот содержимое моих файлов: Global.asax файл:

 public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        }
    }

Web API Config:

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.AddApiVersioning(c => c.AssumeDefaultVersionWhenUnspecified = true);   
        }
    }

Первый контроллер:

namespace WebApplication5.Controllers
{
    [ApiVersion("1.0")]
    [RoutePrefix("api1")]
    public class ValuesController : ApiController
    {
        [Route("values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        [Route("values/{id}")]
        public string Get(int id)
        {
            return "value";
        }
    }
}

Второй контроллер:

namespace WebApplication5.Controllers
{
    [ApiVersion("2.0")]
    [RoutePrefix("api1")]
    [ControllerName("Values")]
    public class ValuesController2 : ApiController
    {
        [Route("values")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        [Route("values/{id}")]

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
    }
}

Когда я запускаю приложение и перехожу по этому URL-адресу: http://localhost:5428/api1/values?api-version=1.0 Я получаю желаемые результаты, но при переходе по этому URL-адресу: http://localhost:5428/api1/values?api-version=2.0 Я сталкиваюсь с сообщением об ошибке, в котором говорится, что No route providing a controller name with API version '2.0' was found to match request URI 'http://localhost:5428/api1/values', мне было интересно, что я Мне не хватает в этой базовой настройке?

Если я удаляю атрибут [ControllerName] из ValuesController2, ничего не меняется и проблема не устраняется.

Я пытался изменить пространство имен второго контроллера, но это тоже не решило проблему!

Я использую версию 3.0.1 этой библиотеки.

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Только что понял, в чем ваша проблема, имя контроллера должно быть Values2Controller, а не ValuesController2.

Контроллер расположен в соответствии с условным обозначением имени, и он отбрасывает часть контроллера, а у вас Controller2, поэтому я думаю, он не найдет его согласно сообщению, которое вы вернули.

0 голосов
/ 15 июня 2019

Не уверен в правильности наличия атрибута ApiVersion на контроллере, но в моей реализации у меня есть этот атрибут в моем действии, например,

    [AllowAnonymous]
    [Route("[controller]")]
    [ApiController]
    public class VersionDemoController
    {
        [ApiVersion("1.1")]
        [HttpGet("requestStuff")]
        public string RequestStuff()
        {
            return "Stuff using Version 1.1 API";
        }
    }

Обновление: Только что попробовал использовать атрибут на контроллере, и он, кажется, работает нормально, мои пространства имен отличаются с одинаковыми именами действий. Я использую версию 3.1.2 пакета управления версиями.

...