【问题标题】:WEB API Routing Error Multiple actions were found that match the request with different API pathsWEB API Routing Error 发现多个动作匹配不同 API 路径的请求
【发布时间】:2017-06-25 21:54:42
【问题描述】:

我正在用 c# 实现 Web API MVC。我的 sn-p 实现是: - WebApiConfig.cs

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

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

与产生问题的方法相关的控制器是: - 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;
}

从休息客户端返回错误:

{"Message": "发生错误。","ExceptionMessage": "多个 找到与请求匹配的操作:getMultiProbe on type HistService.Controllers.HistController getCurrentMultiProbe on type HistService.Controllers.HistController", "ExceptionType": "System.InvalidOperationException", “StackTrace”:“在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext 控制器上下文)在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext 控制器上下文)在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext 控制器上下文,CancellationToken 取消令牌)在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()" }

我不必匹配不同的路径,因为 /currentmultiprobe 和 /probe 上的路径不同。我试图更改路径之间的名称输入参数和服务工作。请问有没有办法进行这种配置。

【问题讨论】:

  • 这会映射到任何其他控制器吗?如果没有,则使用默认值缩小范围。

标签: c# asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing


【解决方案1】:

您可以将一个路由声明与 {action} 一起使用

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;
}

【讨论】:

  • 节省了我的时间。在 webapiconfig 上添加“{controller}/{action}/{id}”解决了我的问题。
【解决方案2】:

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" }
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2016-04-08
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多