以下代码
public class OrderController : Controller
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
}
它可以在ASP.NET 4.5上运行良好,但它不适用于dotnet核心1.1。错误消息:
失败:Microsoft.AspNetCore.Mvc.Internal.ActionSelector [1] 请求匹配的多个操作导致歧义。匹配操作:WebAPI.Controllers.OrderController.Get(WebAPI) WebAPI.Controllers.OrderController.Get(WebAPI)
失败:Microsoft.AspNetCore.Server.Kestrel [13] 连接ID“0HL3F88N44HR6”:应用程序抛出了未处理的异常。 Microsoft.AspNetCore.Mvc.Internal.AmbiguousActionException:匹配多个操作。以下操作匹配路由数据并满足所有约束: WebAPI.Controllers.OrderController.Get(WebAPI) WebAPI.Controllers.OrderController.Get(WebAPI)
答案 0 :(得分:1)
这不是Asp.Net.Core的问题,MVC4和MVC5都有相同的行为。
ASP.NET MVC不支持方法重载,有很多关于此的SO问题和文章:
可能有一组解决方案可以获得所需的行为,其中一个是:
首先 - 使用内置属性,该属性派生自MVC4中的ActionFilterAttribute
或ActionMethodSelectorAttribute
(它是在处理请求时检索所需操作的基类)。例如ActionNameAttribute
,HttpGetAttribute
,HttpPostAttribute
等:
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
[ActionName("GetById")
public string Get(int id)
{
return "value";
}
或者只是重命名您的方法。
另一种解决方案是创建您自己的属性,该属性来自ActionFilterAttribute
,如第二个链接所示。
当我遇到这个问题时,我通过以下列方式传递一个可以为空的参数来解决这个问题:
public object Get(int? id)
{
if (id == null)
return new string[] { "value1", "value2" };
var passedId = (int) id;
return GetValueByPassedId(passedId);
}
答案 1 :(得分:0)
试试这样:
// GET api/values/5
[HttpGet("Get/{id}"]
public string Get(int id)
{
return "value";
}
答案 2 :(得分:0)
您可以通过添加HttpGet属性来解决此问题。
[HttpGet("{id}")]
// GET api/values/5
public string Get(int id)
{
return "value";
}
因为在ASP.NET 5中,对于Web API路由,使用了Routes.MapHttpRoute方法和ASP.NET MVC Routes.MapRoute方法。在ASP.NET Core中,使用了Routes.MapRoute方法。