我正在尝试在 asp.net webapi 上使用 CustomHttpControlSelector 和 AttributeRouting 来实现 api 版本控制。
我想要做的是通过它的命名空间来区分控制器的版本。
如果向 /api/v2/foo/bar 发出请求,我希望它匹配
namespace Web.Controllers.Api.v2
{
[RoutePrefix("foo")]
public class LongerThanFooController : ApiController
{
[HttpGet]
[Route("bar")]
public string BarFunction()
{
return "foobar";
}
}
}
但是正如我所见,当我不在 RoutePrefix (/api/v2/foo) 属性路由上使用完整 url 时,路由不会启动,并且当我调用时我得到 null
request.GetRouteData().GetSubRoutes();
在我的 CustomHttpControlSelector 上。我不想在每个控制器上重复 /api/v2。
如果我决定删除 attributeRouting 并使用手动路由,例如
config.Routes.MapHttpRoute(
name: "DefaultVersionedApi",
routeTemplate: "api/v{version}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional, version = Config.LatestVersion }
);
我失去了命名控制器和功能的所有灵活性。
有没有办法摆脱这个困境?
注意:对于 CustomHttpControlSelector,我修改了http://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs上的代码