WEB API路由错误找到了多个与不同API路径的请求匹配的操作

Ste*_*ano 5 c# asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我正在用c#实现web API MVC.我的代码段实现是: - WebApiConfig.cs

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

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

与生成问题的方法相关联的控制器是: - HistController.cs

[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;
}
Run Code Online (Sandbox Code Playgroud)

从rest客户端返回错误:

{"Message":"发生了错误.","ExceptionMessage":"找到了与请求匹配的多个操作:类型为HistService.Controllers.HistController的类型为HistService.Controllers.HistController getCurrentMultiProbe的getMultiProbe","ExceptionType":" System.Web.Http上的System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)中的System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)中的System.InvalidOperationException","StackTrace":" System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()"}中的.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)

我不必匹配不同的路径,因为/ currentmultiprobe和/ probe的路径不同.我试图改变路径之间的名称输入参数和服务工作.我问是否有办法使用此配置.

Nko*_*osi 5

OP中出错的原因是路由表无法根据模板中的路由参数区分这两个操作,并且两个操作都具有相同的HTTP方法(POST)

在映射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" }
);
Run Code Online (Sandbox Code Playgroud)