C# 使用Microsoft.AspNet.WebApi.versioning进行Web API 2版本控制
我正在使用,我已按照步骤将此库添加到非常基本的ASP.NET 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();
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
。您的问题帮助我理解了如何实现版本控制。我在寻找例子。