C# Dotnet核心可以';无法区分名称相同但参数不同的操作?
下面的代码C# Dotnet核心可以';无法区分名称相同但参数不同的操作?,c#,asp.net-mvc,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core Mvc,下面的代码 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) {
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";
}
}
公共类OrderController:控制器
{
//获取api/值
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
//获取api/values/5
公共字符串Get(int-id)
{
返回“值”;
}
}
它在ASP.NET 4.5上运行良好,但在dotnet core 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)
试着这样做:
// GET api/values/5
[HttpGet("Get/{id}"]
public string Get(int id)
{
return "value";
}
您可以通过添加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方法。这不是ASP.NET.Core的问题,MVC4和MVC5中的行为完全相同 ASP.NET MVC不支持方法重载,有很多关于此的问题和文章:
- 等等
ActionFilterAttribute
或ActionMethodSelectorAttribute
(它是处理请求时检索所需操作的基类)。例如ActionNameAttribute
,HttpGetAttribute
,httpposattribute
,等等:
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
[ActionName("GetById")
public string Get(int id)
{
return "value";
}
它在ASP.NET4.5中无法正常工作,请检查相关链接,这里描述了不同版本ASP.NETIt中的相同问题。Visual Studio生成的演示代码。奥尔兹
public object Get(int? id)
{
if (id == null)
return new string[] { "value1", "value2" };
var passedId = (int) id;
return GetValueByPassedId(passedId);
}