0

다음 작품 :ViewModels에서 WebAPI 컨트롤러 작업 오버로드가 작동하지 않습니까?

public class UsageController : ApiController 
{ 
    public int GetMilk(string param1, string param2) 
    { 
     return -1; 
    } 

    public string GetBilling(string param1) 
    { 
     return null; 
    } 
} 

그러나 다음은 예외 "여러 행동이 요청과 일치하는 것을 발견했다"던졌습니다?!?!

public class UsageController : ApiController 
{ 
    public int GetMilk(MilkVM vm) 
    { 
     return -1; 
    } 

    public string GetBilling(BillingVM vm) 
    { 
     return null; 
    } 
} 

어떻게 해결할 수 있습니까?

+0

WebAPI가 URI의 매개 변수가 MilkVM 또는 BillingVM에 속하는지 여부를 어떻게 알 수 있었으면 좋겠습니까? –

+0

각 뷰 모델에서 사용할 수있는 매개 변수를 비교하여? –

답변

0

기본적으로 ASP.NET 웹 API는 HTTP 동사와 동작 메서드 매개 변수를 기반으로 동작 방법을 선택합니다. 두 번째 경우에는 GET을 처리 할 수있는 두 가지 액션 메소드가 있으며 각각 하나의 매개 변수가 있습니다. 웹 API가 GET에 대한 조치 메소드 (more info here)를 찾으려고 할 때, 두 메소드를 찾을 수 있습니다.

이와 같은 조치 방법이 있어야하는 경우 RPC 스타일 URI를 따라갈 수 있습니다. 이와 같이 WebApiConfig.cs에 매핑을 추가하십시오.

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "RpcStyle", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

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

그런 다음 동작 방법이 http://localhost:port/api/usage/getmilk?a=1&b=2 인 URI에 GET하십시오.

질문 : 귀하의 조치 방법은 쿼리 문자열을 기본적으로 복잡한 유형으로 바인딩 할 수 없습니다. 다음과 같이 FromUri 속성을 사용하십시오 : public int GetMilk([FromUri]MilkVM vm). GET 요청에는 요청 본문이 없어야하며 따라서 복잡한 유형은 기본적으로 바인딩되지 않습니다.

+0

이것은 나를 위해 작동하지 않습니다. 일반적으로, 나는 당신이 제안한 것을 정확히 할 것입니다. 그러나이 특별한 경우에는 WebAPI를 사용하지 않은 사람이 함께 응용 프로그램을 리팩토링하려고합니다. 결과적으로 클라이언트는 컨트롤러 (BillingVM, MilkVM)에서 모델 바인딩을 원하지만 각 엔드 포인트에 너무 많은 코드가 이미 작성되어 있으므로 각 액션에 대한 URL을 변경할 수 없습니다. –

관련 문제