【问题标题】:WebApi routes with same routeTemplate with version constraint具有相同 routeTemplate 和版本约束的 WebApi 路由
【发布时间】:2012-10-18 16:27:44
【问题描述】:

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

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


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

【问题讨论】:

    标签: c# asp.net-web-api asp.net-mvc-routing


    【解决方案1】:

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

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

    【讨论】:

    • 嗯...我不知道为什么我的搜索中没有出现这个,这正是我要找的。​​span>
    • 使用 Web API v2 中的新属性路由,您也可以使用基于 URL 的路由,只需在 RoutePrefix 属性(针对整个控制器)中引入版本或在操作级别使用 Route 属性
    • 这只是为控制器中方法的所有路由添加前缀。 IHttpControllerSelector 的默认实现不区分具有相同类名的两个控制器(当然它们位于不同的命名空间中)。你仍然需要一个自定义的 IHttpControllerSelector 实现。
    • 嗨!我已经通过 Header 使用 web api 版本。我的问题是我们如何在 Swagger UI 中将其分开或分组?我使用网络框架 4.7 。请需要你们的帮助
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多