2012-08-02 2 views
0

WebAPI 응용 프로그램의 개념 증명 프로토 타입을 작성하고 있으며 모든 일반적인 방법이 훌륭하게 작동합니다. 그러나 WebAPI를 통해 사용자 지정 메서드를 호출 할 수 있음을 보여주고 싶었습니다. 내 메소드를 호출하려고 시도WebAPI에서 호출하는 사용자 정의 메서드

[HttpGet] 
public string Test() 
{ 
    return "this is a string"; 
} 

: http://localhost:43225/api/values/test 난에서 오류를 다음 얻을 나는 간단한 방법이 컨트롤러에서

routes.MapHttpRoute(
       name: "ActionApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

: 그래서 다음 내 RouteConfig.cs에서 라우팅이 브라 우어 :

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"> 
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'WebAPI_Listener.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
</string> 

하지만 그것은 작동 등 http://localhost:43225/api/values/test/1로 URL의 끝에 ID를 지정하면, 방법 자체가 파를하지 않는 경우에도 ameter 전혀.

그래서 라우팅에서 {id}를 지정하지 않으면 {id}를 지정하지 않아도 {id}를 지정하지 않으면 작동하지만 작동하지 않는 이유는 메소드 자체가 ' {id}를 기대하고 있니?

답변

5

~/App_Start/WebAPIConfig.cs 등록 메소드에서 API 경로를 선언해야합니다. WebAPIConfig의 catchall 라우트가 RouteConfig 라우트보다 우선하여 라우트가 선택되지 않습니다.

다음은 WebAPIConfig에 비슷한 경로를 추가하는 예입니다. 이 예제에는 다음과 같은 단점이 있습니다.이 경로와 일치하는 컨트롤러 (즉, ~/localhost : 43225/api/values ​​/ 5 대신 ~/api/values ​​/ get/5)에 대해 명시 적으로 HTTP 동사를 명시해야합니다.

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

는이 같은 특정 컨트롤러에 경로를 제한 할 수 있습니다, 이러한 단점을 방지하려면 : 또한 표준 동사를 보존하기 위해 컨트롤러와 행동에 대한 경로를 제한 할 수

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

하지만, 이 작업을 많이 수행하면 유지 관리 문제가되거나 혼란이 생길 ​​수 있습니다.

 config.Routes.MapHttpRoute(
      name: "ApiNonCrudActionsForMyController", 
      routeTemplate: "MyController/Test/{id}", 
      defaults: new { controller = "MyController", action = "Test", id = RouteParameter.Optional } 
     ); 

자세한 내용 및 기타 접근 방법은 http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/을 확인하십시오. 또한 HTTP 동사로 동작을 제한하고 맞춤 동작 (예 : ~/localhost : 43225/api/TestValues ​​/ 5)을위한 추가 컨트롤러를 추가하는 것도 고려해 볼 수 있습니다.

관련 문제