2014-01-14 21 views
0

我有根据的WebAPI V1一个项目的WebAPI使用以下确定使用API​​的版本...版本中WebApi2

public override HttpControllerDescriptor SelectController(HttpRequestMessage request) 
    { 
     var controllers = GetControllerMapping(); 
     var routeData = request.GetRouteData(); 
     var controllerName = (string)routeData.Values["controller"]; 
     HttpControllerDescriptor result = null; 

     if (!controllers.TryGetValue(controllerName, out result)) 
     { 
      string version; 
      if (!GetVersionFromMediaType(request, out version)) 
      { 
       if (!GetVersionFromAcceptHeaderVersion(request, out version)) 
       { 
        if (!GetVersionFromHeader(request, out version)) 
        { 
         if (!GetVersionFromQueryString(request, out version)) 
         { 
          version = LATEST_VERSION; 
         } 
        } 
       } 
      } 

      HttpControllerDescriptor versionedDescriptor; 

      var newName = string.Concat(controllerName, "V", version); 
      if (controllers.TryGetValue(newName, out versionedDescriptor)) 
      { 
       result = versionedDescriptor; 
      } 
     } 

     return result; 
    } 

我敲了使用测试WebApi2我注意到,如果我已经使用属性路由定义了我的路由,则此过程失败,因为request.GetRouteData()不包含任何对控制器的引用(我可以找到)。

这是否意味着我仅限于通过在路由本身中包含版本来进行版本控制?

回答

0

您可以检查我的答案在下面的帖子:

Versioning ASP.NET Web API 2 with Media Types

此外,在即将来到的Web API 2.1(集版本5.1.0.0)释放,对路线级约束的支持(请注意,这与我们已有的'内联'约束不同),您可以使用它来处理版本控制场景。当然,这只与属性路由有关。

以下是带有2.1 RC位的示例: http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RoutingConstraintsSample/ReadMe.txt