【问题标题】:Why is index method not called when action name is not specified为什么未指定动作名称时不调用索引方法
【发布时间】:2020-09-20 22:46:07
【问题描述】:

我有一个带有以下控制器的简单 ASP.NET Core API:

[ApiController]
[Route("api/[controller]")]
public class HomeController : ControllerBase
{
    public IActionResult Index()
    {
        return Ok("index");
    }

    public IActionResult Get()
    {
        return Ok("get");
    }
}

当我点击网址时:

"http://localhost:6001/api/home"

使用GET 请求,我收到以下错误:

"The request matched multiple endpoints."

通常,如果我不指定动作名称,它不应该调用Index() 方法吗?

【问题讨论】:

  • 如果您将操作 Get 更改为另一个名称,您会收到相同的错误吗?
  • 似乎对动作名称没有影响。在这种情况下,“索引”和“获取”都没有特殊效果。

标签: c# .net-core asp.net-core-webapi


【解决方案1】:

在 ASP.NET Core API 中,操作方法由用作方法属性的 HTTP 谓词(如果不添加,则默认为 HttpGet)和与之一起使用的路由参数的组合匹配。从这个意义上说,您的两种操作方法看起来都类似于路由系统。它看到两个没有路由参数的HttpGet 方法。这就是为什么这两种方法都匹配请求 -

"http://localhost:6001/api/home"

使路由系统混淆选择哪个。这正是错误消息所说的内容。

您需要使您的非默认操作方法更具体,以便路由机制可以区分两者。有点像 -

[HttpGet("data")]
public IActionResult Get()
{
    return Ok("get");
}

现在您的 Index 方法将作为默认操作方法与上述 URL 匹配。

【讨论】:

  • 那么,要让 Index 作为默认值,我应该在 MVC 环境中吗?你能解释一下区别吗?
  • @M.Azyoksul 我真的对 Razor Pages 应用程序中的路由一无所知(如果您认为这是非 MVC 环境的话)。对于 MVC,Asp.Net Core 中有两种可用的路由策略。我在答案中提到的特定于 Attribute Routing,默认情况下由 Asp.Net Core API 使用。有关更多详细信息,请查看 - docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
【解决方案2】:

您的两个端点是相同的。使用路线来区分它们。例如:

[ApiController]
[Route("api/[controller]")]
public class HomeController : ControllerBase
{
    [HttpGet]
    public IActionResult Index()
    {
        return Ok("index");
    }

    [HttpGet, Route("data")]
    public IActionResult Get()
    {
        return Ok("get");
    }
}

这会打开:

http://localhost:6001/api/home/

http://localhost:6001/api/home/data

分别使用GET

您还可以更改动词,例如使用HttpGet 表示一个,使用HttpPost 表示另一个。

【讨论】:

  • 问题不是如何显式定义路由,而是如何在没有指定方法时隐式路由到索引方法(即在网址。
  • 你不能。您必须以某种方式区分它们。我将索引更改为默认 GET,但您不能有 2 个默认 GET,这是他正在做的。
  • 我不是说你错了。我是说您没有在回答中解决它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2016-07-31
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多