2017-03-12 2 views
1

저는 MVC에서 라우트와 라우팅을 설정하는 데 새로운 경험이 있습니다. 마지막으로 WebAPI에 대한 속성 라우팅을 사용 했으므로 (예 : RoutePrefix, RouteHttpGet/HttpPost 속성 등) 익숙합니다. 그리고 현재의 프로젝트를 속성으로 잘 작동하도록 할 수 있습니다.WebAPI와 MVC AttributeRouting을 경로 접두사와 함께 사용 하시겠습니까?

그래서 이제는 "api"가있는 모든 webApi 경로에 "접두사"를 붙이고 싶습니다. 그래서 mysite/test/hello에가는 대신 mysite/api/test/hello에 가고 싶습니다.

이 내가 라우팅 속성만을 사용하여, 무엇을, 그리고 그것을 잘 작동합니다 :

[RoutePrefix("Test")] 
public class TestController : ApiController 
{ .... 

    [HttpPost] 
    [Route("{message}")] 
    public HttpResponse EchoBack(string message) 
    { 
     // return message ... in this case, "hello" 
    } 
} 

을 지금, 내가, 내가 RoutePrefix에 'API/테스트 "(100 % 작동하는)를 변경할 수 있습니다 알고 하지만 모든 컨트롤러를 변경하고 싶지는 않지만 WebApiConfig에서 전달 된 값을 config.Routes.MapHttpRoute으로 변경하여이 작업을 수행 할 수 있습니다.

이것이 가능합니까?

+0

당신이 설명하는 것은 관습 기반 라우팅이며 동일한 컨트롤러의 속성 라우팅과 잘 섞이지는 않습니다. 컨트롤러는 규칙 기반 라우팅 또는 속성 라우팅을 준수합니다. 둘 다 아닙니다. 당신은 모든 컨트롤러 또는 모든 컨벤션 기반 컨트롤러를 가질 수 있습니다. 속성 라우트는 IMO를 통해 더 많은 유연성을 제공합니다. https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Nkosi

+0

감사합니다. @Nkosi. 그래서 당신이 말하는 것은 속성 기반 컨트롤러를 "api"접두어로 변경하려는 경우 각 컨트롤러의 RoutePrefix 특성에서 수행해야하며 규칙/맵을 무시해야합니다. (오늘 밤 MSDN 기사를 읽으 리니, 그것을 찾아 주셔서 감사합니다 !!) –

+0

No.모든 컨트롤러에있는 것은 아닙니다. 나는 당신이 찾고있는 것만 큼 좋은 기사를 발견했다. http://www.strathweb.com/2015/10/global-route-prefixes-with-attribute-routing-in-asp-net-web-api / – Nkosi

답변

1

글로벌 라우팅 접두어라고하는 것을 사용하여 특성 라우팅에서 설명 할 수 있습니다.

기사를 인용하려면 DirectRouteProvider

public class CentralizedPrefixProvider : DefaultDirectRouteProvider { 
    private readonly string _centralizedPrefix; 

    public CentralizedPrefixProvider(string centralizedPrefix) { 
     _centralizedPrefix = centralizedPrefix; 
    } 

    protected override string GetRoutePrefix(HttpControllerDescriptor controllerDescriptor) { 
     var existingPrefix = base.GetRoutePrefix(controllerDescriptor); 
     if (existingPrefix == null) return _centralizedPrefix; 

     return string.Format("{0}/{1}", _centralizedPrefix, existingPrefix); 
    } 
} 

만들기이 문서를 Global route prefixes with attribute routing in ASP.NET Web API

을 참조하는.

위의 그림은 이며 모든 경로 앞에 접두사가 붙습니다. 특정 컨트롤러에 자신의 경로 접두어 (base.GetRoutePrefix 메서드를 통해 얻은 호출)가 있으면 중앙 접두어가 단순히 앞에 붙습니다. 이

[RoutePrefix("Test")] 
public class TestController : ApiController { 
    [HttpPost] 
    [Route("{message}")] 
    public IHttpActionResult EchoBack(string message) { ... } 
} 

같은 컨트롤러가있는 경우 이제이

config.MapHttpAttributeRoutes(new CentralizedPrefixProvider("api")); 

같은 WebAPiConfig에서

구성은 예를 들어 위의 조치는

<<host>>/api/Test/{message} 
를 통해 액세스됩니다

여기서, api wi 컨트롤러 동작 경로 앞에 추가됩니다.