Web API 2 版本控制 Microsoft.AspNet.WebApi.Versioning
Web API 2 versioning with Microsoft.AspNet.WebApi.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'
,我想知道我在这个基本设置中缺少什么?
如果我从 ValuesController2
中删除 [ControllerName]
属性,则没有任何变化,问题仍然存在。
我尝试更改第二个控制器的命名空间,但也没有解决问题![=24=]
我正在使用此库的 3.0.1 版本。
不确定在控制器上具有 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
。
控制器的位置使用名称约定,它删除了控制器部分,但你的是 Controller2,所以我猜它没有根据你收到的消息找到它。
我正在使用 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'
,我想知道我在这个基本设置中缺少什么?
如果我从 ValuesController2
中删除 [ControllerName]
属性,则没有任何变化,问题仍然存在。
我尝试更改第二个控制器的命名空间,但也没有解决问题![=24=]
我正在使用此库的 3.0.1 版本。
不确定在控制器上具有 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
。
控制器的位置使用名称约定,它删除了控制器部分,但你的是 Controller2,所以我猜它没有根据你收到的消息找到它。