2011-05-09 2 views
3

내 원래 문제 나는 평안한 API에 버전 관리를 할 수있는 가장 좋은 방법이 무엇인지 찾고있다. 많은 사람들이 이것에 대해 말하지 않고, 좋은 대답을하지 못하거나이 순간에 정확하게 해결책을 찾지 못했습니다.ASP.NET MVC 3 리 라우트 다른 컨트롤러와 액션 & 평안한 API 버전

(1) 처음에는 각 버전 http://domain.com/API/ {version}에 Tag 또는 Branch을 사용하려고합니다. 따라서 새로운 API가 출시되면 해당 URL에 Tag이 내보내지고 게시되지만 하나의 웹 응용 프로그램에서 서로 다른 소스 개정판을 혼합하는 것처럼 보입니다.

(2) 나는이 방법으로, 하나의 버전에 해당하는 하나의 컨트롤러를 사용하여 생각하고 그런 : (그냥이 질문에 같은 Versioning of REST API Built With ASP.NET MVC 3 - Best Practices)

http://domain.com/API/1.0/{AnAction} => will go to APIV1Controller.{AnAction}

http://domain.com/API/2.0/{AnAction} => will go to APIV2Controller.{AnAction}

그러나 그것은을 작성해야 각 버전에 대한 경로.

(3) 제 3의 방법은 URL이 아니라 POST 매개 변수 인 PayPal API에서 아이디어를 얻습니다. URL은 http://domain.com/API/으로 고정되었지만 사용자는 또는 "2.0"이되도록 Version 매개 변수를 지정해야합니다.

해결 방법 : (2)는 괜찮습니다. 현재는이 방법을 사용하고 있지만 (2)와 (3)을 혼합하여 APIController에 하나의 색인 작업 만 있습니다. 이 Version 매개 변수를 요청하고 해당 컨트롤러에 요청을 전송하고 APIV1Controller. {AnAction} 또는 APIV2Controller. {AnAction} 중 하나를 수행하십시오.

리디렉션없이 다른 컨트롤러와 동작을 전송, 호출 또는 호출하는 방법에 대한 인터넷 검색 및 스택 오버 플로우 이후. 좋은 대답과 좋은 습관이없는 것 같습니다. 컨트롤러의 새 인스턴스를 생성하기 만하면 누군가 .NET MVC Call method on different controller에 응답합니다. 갑자기 나는 대략 reroute에 대한 생각을 얻었다!

질문 :

가 리디렉션 어떻게 그렇게하지 않고 다른 동작에서 다른 컨트롤러와 액션이 reroute 할 수 있습니까?

또는 특정 질문, 때 Version="2.0"와 사용자 요청 http://domain.com/API/{AnAction}, 어떻게 rerouteAPIController.Index에서 APIV2Controller.{AnAction}하는 방법을 할 수 있습니까?

IoC를 사용하고 있지 않습니다.

+0

그렇게 할 방법이없는 것 같습니까? – CallMeLaNN

답변

1

라우팅 제약 조건을 통해 수행 할 수 있습니다.첫째 IRouteConstraint을 구현 :

public class RequestParameterConstraint : IRouteConstraint 
{ 
    public string ParameterName { get; private set; } 
    public string ParameterValue { get; private set; } 

    public RequestParameterConstraint(string parameter, string value) 
    { 
     ParameterName = parameter; 
     ParameterValue = value; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
     RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var value = httpContext.Request[ParameterName] ?? ""; 
     return value.Equals(ParameterValue); 
    } 
} 

는 다음 경로를 등록 : 전부

routes.MapRoute(
    "Version10", 
    "API/{action}/{id}", 
    new { controller = "APIV1", action = "Index", id = UrlParameter.Optional }, 
    new { header = new RequestParameterConstraint("Version", "1.0") } 
    ); 

routes.MapRoute(
    "Version20", 
    "API/{action}/{id}", 
    new { controller = "APIV2", action = "Index", id = UrlParameter.Optional }, 
    new { header = new RequestParameterConstraint("Version", "2.0") } 
    ); 

합니다. 이것은 트릭을 할 것입니다.