使用Microsoft.AspNet.WebApi.Versioning进行Web API 2版本控制

时间:2019-06-15 10:50:47

标签: c# asp.net api-versioning aspnet-api-versioning

我正在使用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配置:

  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 个答案:

答案 0 :(得分:2)

刚意识到您的问题是什么,控制器名称应为Values2Controller而不是ValuesController2

使用名称上的约定将控制器定位,并删除控制器部分,但您使用的是Controller2,因此我想根据您收到的消息找不到它。

答案 1 :(得分:0)

不确定在控制器上具有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版本。