【发布时间】:2012-10-18 16:27:44
【问题描述】:
我正在使用 WebAPI 构建一个 api。我的目标是为每个版本的 API 创建一个外部库,WebAPI 应用程序在 WebApiConfig 中注册其路由时将查询该 API
示例: Api.v1 和 Api.v2
它们将共享相似的功能,但基于在标头中传递的version,它将选择正确的 API 版本:
/{controller}/{action} - HTTP-HEADER: version=1 映射到 Api.v1.Controller/Action
/{controller}/{action} - HTTP-HEADER: version=2 映射到 Api.v2.Controller/Action
我们的目标是避免使用前缀 /{ver}/{controller}/{action}。我知道不支持 routeTemplates 具有相同的值,但我认为我可以将路由绑定到特定的命名空间,并且约束可能有助于解决匹配的问题:
namespace Api.v1
{
public static class Routing
{
public static void MapRoutes(HttpConfiguration config)
{
IHttpRoute r = config.Routes.MapHttpRoute(
name: "",
routeTemplate: "{controller}/{action}/{id}",
defaults: new
{
id = RouteParameter.Optional,
namespaces = new string[] { "Api.v1.Controllers" }
},
constraints: new VersionConstraint(2)
);
}
}
}
public class VersionConstraint : IRouteConstraint
{
int _version;
public VersionConstraint(int version)
{
_version = version;
}
public bool Match(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
int version;
int.TryParse(httpContext.Request.Headers["version"], out version);
return version == _version;
}
}
尝试为每条路由注入namespaces 也没有真正的帮助。 DataTokens 属性为空且只读。
知道我在做什么吗?有什么方法可以将相同的路由映射到具有相同名称但具有不同功能和命名空间的不同控制器?
【问题讨论】:
标签: c# asp.net-web-api asp.net-mvc-routing