C# 使用Microsoft.AspNet.WebApi.versioning进行Web API 2版本控制

C# 使用Microsoft.AspNet.WebApi.versioning进行Web API 2版本控制,c#,asp.net,api-versioning,aspnet-api-versioning,C#,Asp.net,Api Versioning,Aspnet Api Versioning,我正在使用,我已按照步骤将此库添加到非常基本的ASP.NET Web API 2项目中,以下是我的文件内容: Global.asax文件: public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas();

我正在使用,我已按照步骤将此库添加到非常基本的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";
        }
    }
}
命名空间WebApplication5.控制器
{
[ApiVersion(“1.0”)]
[RoutePrefix(“api1”)]
公共类值控制器:ApiController
{
[路线(“价值”)]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
[路由(“值/{id}”)]
公共字符串Get(int-id)
{
返回“值”;
}
}
}
第二控制器:

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";
        }
    }
}
命名空间WebApplication5.控制器
{
[ApiVersion(“2.0”)]
[RoutePrefix(“api1”)]
[控制器名称(“值”)]
公共类值控制器2:ApiController
{
[路线(“价值”)]
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
[路由(“值/{id}”)]
//获取api/values/5
公共字符串Get(int-id)
{
返回“值”;
}
}
}
运行应用程序并导航到此url时:
http://localhost:5428/api1/values?api-version=1.0
我得到了想要的结果,但当我导航到此url时:
http://localhost:5428/api1/values?api-version=2.0
我遇到一条错误消息,指出
未找到任何提供API版本为“2.0”的控制器名称的路由与请求URI匹配'http://localhost:5428/api1/values“
,我想知道这个基本设置缺少什么

如果我从
值controller2
中删除
[ControllerName]
属性,则不会发生任何更改,并且问题仍然存在

我试图更改第二个控制器的名称空间,但也没有解决问题


我正在使用此库的版本。

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

刚刚意识到您的问题所在,控制器名称应该是
Values2Controller
而不是
ValuesController2


控制器的名称使用be约定进行定位,它会删除控制器部分,但您的控制器是Controller2,因此我猜它无法根据您返回的消息找到它。

我猜您正在使用此库的.net核心版本!我正在使用旧的.NETWebAPI 2Wow!这真的很有效,这是我错过的一个非常微妙的点。我不想从Andrew HB身上拿走任何东西,但我想进一步说明为什么会发生这种情况。这不是由于API版本控制,而是由于ASP.NET Web API的工作方式。如果检查该方法,您将看到有效的控制器类型必须以
controller
结尾,而您的控制器不以
结尾。我记得,这种情况的历史是忽略非抽象超类型,例如
XXXControllerBase
。您的问题帮助我理解了如何实现版本控制。我在寻找例子。