2014-01-14 20 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