2014-11-21 8 views
0

이 WebAPI 컨트롤러에는 두 가지 방법이 있습니다. 이 컨트롤러는 유틸리티 유형 콘트롤러에 가깝습니다. 대부분의 예제와 보일러 플레이트 템플릿과 같이 하나의 유형의 엔티티에만 집중하지 않습니다. 어쨌든, 제 2 방법은 다음과 같이이다 :웹 API 2.0 라우팅 - 여러 작업 일치

// api/Custom/SayHello 
    [HttpGet] 
    public async Task<string> SayHello() 
    { 

     return await Task.FromResult("Hello World Async").ConfigureAwait(false); 
    } 

    // api/Custom/SayFloat 
    [HttpGet] 
    public async Task<float> SayFloat() 
    { 

     return await Task.FromResult(1000.0f).ConfigureAwait(false); 
    } 

그리고 템플릿 조합을 라우팅을 많이 겪었어요, 내 최신 하나가 이것이다 :이 오류를 받고 있어요

 config.Routes.MapHttpRoute("DefaultApiWithId", 
      "Api/{controller}/{id}", 
      new { id = RouteParameter.Optional }); 

     /* ----- this is trying to match my utility controller and its actions ----- */ 
     config.Routes.MapHttpRoute(
       name: "ActionApi", 
       routeTemplate: "Api/{controller}/{action}" 
      ); 

: 여러 작업이 요청과 일치하는 것으로 확인되었습니다. ...

현재 나의 "해결 방법"은 공개하려는 유틸리티 메서드마다 하나의 컨트롤러를 만드는 것입니다. 내가 라우팅 템플릿으로 시도하지 않은 것이 있어야한다고 생각합니다. 어떤 아이디어?

답변

4

이 질문에 대한 다른 대답은 정확합니다. 그러나 나는 팬인 대안 인 Attribute Routing을 제공하고 싶다. 특성 라우팅

The first release of Web API used convention-based routing. In that type of routing, you define one or more route templates, which are basically parameterized strings. When the framework receives a request, it matches the URI against the route template.

, 다른 한편으로는, 당신은 당신의 컨트롤러 및 훨씬 더 유연한 라우팅 방식을 허용 특성과 작업을 장식합니다.

[Route("api/custom")] 
public class CustomController : ApiController 
... 
// api/Custom/SayHello 
[Route("SayHello")] 
[HttpGet] 
public async Task<string> SayHello() 
{ 
    return await Task.FromResult("Hello World Async").ConfigureAwait(false); 
} 

// api/Custom/SayFloat 
[Route("SayFloat")] 
[HttpGet] 
public async Task<float> SayFloat() 
{ 
    return await Task.FromResult(1000.0f).ConfigureAwait(false); 
} 
+0

WebApi2를 사용하는 경우 특성 라우팅이 더 좋은 방법입니다. –

1

웹 API는 그들을 찾아 순서대로 경로를 일치합니다, 그래서 당신은 당신의 경로의 순서를 변경해야이가 함께 작업 defaultapi 경로를 중지합니다

config.Routes.MapHttpRoute(
    name: "ActionApi", 
    routeTemplate: "Api/{controller}/{action}" 
    ); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routetemplate "Api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
    ); 

그러나 경고의 말씀을, id 매개 변수 컨트롤러를 명시 적으로 선언하는 것이 더 낫습니다.

config.Routes.MapHttpRoute(
    name: "ActionApi", 
    routeTemplate: "Api/Custom/{action}", 
    defaults: new { controller = "Custom" } 
    ); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routetemplate "Api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
    );