4

C#에서 웹 API MVC를 구현 중입니다. 내 조각 구현은 다음과 같습니다 - WebApiConfig.cs WEB API 라우팅 오류 다른 API 경로로 요청과 일치하는 여러 작업을 찾았습니다.

config.Routes.MapHttpRoute(
    name: "getMultiProbe", 
    routeTemplate: "api/v1/{controller}/probe/{server}" 
); 

config.Routes.MapHttpRoute(
    name: "getCurrentMultiProbe", 
    routeTemplate: "api/v1/{controller}/currentmultiprobe/{server}" 
); 

그리고 문제를 생성하는 방법과 관련된 컨트롤러

있습니다 - 오류를 반환

나머지 클라이언트에서
[HttpPost] 
public Dictionary<string, List<DataSample>> getMultiProbe(string server, [FromBody] Dictionary<string,Object> request) 
{  
    Debug.WriteLine("ENTER [GetMultiProbe] "+ request["from"] + " - mode: " + request["mode"]); 
    string[] tagnames = (string [])request["tagnames"]; 
    return null;   
} 

[HttpPost] 
public Dictionary<string, Object[]> getCurrentMultiProbe(string server, [FromBody] String[] tagnames) 
{  
    Debug.WriteLine("ENTER [getCurrentMultiProbe] server: " + server + " - tagnames: " + tagnames); 
    return null; 
} 

HistController.cs는 :

{"Message": "An error has occurred.","ExceptionMessage": "Multiple actions were found that match the request: getMultiProbe on type HistService.Controllers.HistController getCurrentMultiProbe on type HistService.Controllers.HistController", "ExceptionType": "System.InvalidOperationException", "StackTrace": " at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()" }

/currentmultiprobe 및/probe에서 경로가 다르기 때문에 다른 경로와 일치시킬 필요는 없습니다. 경로와 서비스 사이에서 이름 입력 매개 변수를 변경하려고했습니다. 이 구성을 사용할 수있는 방법이 있는지 묻습니다.

+0

에 컨트롤러에서 사용이 다른 컨트롤러에 매핑 할 예정 할 수 있습니까? 그렇지 않으면 기본값을 사용하여 범위를 좁 힙니다. – Nkosi

답변

4

영업 이익이 오류의 원인은 라우팅 테이블이 모두 액션 템플릿과 그 경로 매개 변수에 따라 (POST)

매핑을 좁히 같은 HTTP 방법이 두 가지 작업을 구분하지 수 있다는 것입니다 맵핑 할 때 defaults 매개 변수를 사용하여 경로 (라우트)를 지정하십시오.

config.Routes.MapHttpRoute(
    name: "getMultiProbe", 
    routeTemplate: "api/v1/{controller}/probe/{server}", 
    defaults: { controller = "Hist", action = "getMultiProbe" } 
); 

config.Routes.MapHttpRoute(
    name: "getCurrentMultiProbe", 
    routeTemplate: "api/v1/{controller}/currentmultiprobe/{server}", 
    defaults: { controller = "Hist", action = "getCurrentMultiProbe" } 
); 
+0

그것이 작동합니다! 큰 – Stefano

2

당신은 {동작}

config.Routes.MapHttpRoute(
     name: "ActionRoute", 
     routeTemplate: "api/v1/{controller}/{action}/{server}" 
    ); 

하나 명의 경로 선언을 사용하고 그 방법

[HttpPost] 
[ActionName("probe")] 
public Dictionary<string, List<DataSample>> getMultiProbe(string server, [FromBody] Dictionary<string,Object> request) 
{  
    Debug.WriteLine("ENTER [GetMultiProbe] "+ request["from"] + " - mode: " + request["mode"]); 
    string[] tagnames = (string [])request["tagnames"]; 
    return null;   
} 

[HttpPost] 
[ActionName("currentmultiprobe")] 
public Dictionary<string, Object[]> getCurrentMultiProbe(string server, [FromBody] String[] tagnames) 
{  
    Debug.WriteLine("ENTER [getCurrentMultiProbe] server: " + server + " - tagnames: " + tagnames); 
    return null; 
}