【问题标题】:ASP.NET Core Web API multiple actions with the same action verb but different signatureASP.NET Core Web API 具有相同动作动词但不同签名的多个动作
【发布时间】:2019-01-18 22:52:10
【问题描述】:

假设我有

[HttpPost]
public ActionResult<Object> Login([FromBody]LoginViewModel loginViewModel)
  {
    ....
  }

[HttpPost]
public ActionResult Logout()
  {
    ....
  }

在同一个控制器中。

我得到 AmbiguousActionException: Multiple actions match。 以下操作匹配路线数据并具有所有约束 使满意:

...登录
...注销

我可以通过使用 route 属性简单地修复它,但我不明白为什么 core 不绑定它。我的意思是签名不同。 ?

【问题讨论】:

  • 问题有问题...动作不同;所以签名无关紧要!
  • @Felix 这是网络 API...
  • 我意识到......所以? http://server/account/Login 将匹配一个动作,http://server/account/Logout 匹配另一个动作(旁注 - 注销通常是获取;而不是发布)

标签: c# asp.net asp.net-web-api asp.net-core-webapi asp.net-core-2.1


【解决方案1】:

Web api 的路由机制,Core 和 .NET 框架的工作方式相同。首先他们考虑控制器名称,然后他们寻找正确的 http 方法,最后他们查看查询字符串参数是否匹配(或包含在 Route 指定的 url 中的参数)。因此,如果您的 2 个操作因从 url 获取的参数而异,那么就没有歧义。 body携带的参数不会被路由机制分析,即使它们有或没有。这源于一个事实,即来自 url 的参数只是普通字符串 - 易于比较。而 body 是一个 json,分析起来比较棘手。事实上,在 Login 方法的情况下,请求中没有参数 loginViewModel - 整个请求体被序列化为 LoginViewModel 对象。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多