8

我正在使用 WebAPI 构建一个 api。我的目标是为每个版本的 API 创建一个外部库,WebAPI 应用程序在注册其路由时将查询该库WebApiConfig

示例: Api.v1Api.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属性为空且只读。


知道如何做我正在做的事情吗?有什么方法可以将相同的路由映射到同名但具有不同功能和命名空间的不同控制器?

4

2 回答 2

8

看看Versioning ASP.NET Web API Services Using HTTP Headers,这似乎回答了您关于如何根据 HTTP 标头的存在进行路由的问题。

您将默认控制器选择器替换为自定义IHttpControllerSelector,该选择器根据 HTTP 标头选择正确的控制器。

于 2012-10-18T17:12:01.860 回答
0

ASP.NET Web API:使用命名空间对 Web API 进行版本化 http://blogs.msdn.com/b/webdev/archive/2013/03/08/using-namespaces-to-version-web-apis.aspx

于 2014-09-18T19:37:24.837 回答