【问题标题】:web api versioning with default link带有默认链接的 web api 版本控制
【发布时间】:2018-04-12 01:03:35
【问题描述】:

我有两个版本的 web api v1 和 v2,它们就像控制器中的文件夹,这些文件夹包含具有相同名称和方法的控制器。 我的 WebApiConfig 看起来像这样

       config.Routes.MapHttpRoute(
            "DefaultApi", 
            "api/v{version}/{controller}/{id}",
            new {id = RouteParameter.Optional}
            );
        config.Services.Replace(typeof(IHttpControllerSelector), new HttpControllerSelector((config)));

我的链接分别看起来像api/v1/custum/get?id=3api/v2/custum/get?id=3,我如何在最后一个版本的链接api/custum/get?=3 中进行导航,即v2/custum/get?id=3

【问题讨论】:

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


    【解决方案1】:

    你可以像这样设置版本参数的默认值

      config.Routes.MapHttpRoute(
                "DefaultApi",
                "api/{version}/{controller}/{id}",
                new
                {
                    version="v2",
                    id = RouteParameter.Optional
                }
    

    【讨论】:

    • 请看我的例子,我把 v{version} 换成了 {version}
    • 我明白了,但是当我在 HttpControllerDescriptor public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { var controllers = GetControllerMapping(); var routeData = request.GetRouteData();它只有两个参数和 version == controllerName
    【解决方案2】:

    拥有版本化 API 的路由配置和后备配置。例如,

    config.Routes.MapHttpRoute(
        name: "VersionedApi",
        routeTemplate: "api/{version}/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    第一个将调用映射到特定版本。第二个在路线中没有版本。在您的HttpControllerSelector 中,尝试获取version 的值,如果第二个路由配置不存在,请将其设置为默认版本。

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 2018-11-22
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多