【问题标题】:WebAPI controller same action different parametersWebAPI控制器相同的动作不同的参数
【发布时间】:2014-09-21 18:52:02
【问题描述】:

我有一个带有 2 个动作的基本控制器:

    [ActionName("Find")]
    [HttpGet]
    public virtual IHttpActionResult Find(string name)
    {
        return null;
    }

    [ActionName("Find")]
    [HttpGet]
    public virtual IHttpActionResult Find(int number)
    {
        return null;
    }

我的一些控制器使用不同的 Find 方法,例如:

    public override IHttpActionResult Find(string number)
    {
        return OK;   
    }

但是,从客户端调用此操作时出现错误:

Multiple actions were found that match the request: \r\nFind on type API.Controllers.CustomerController

我该如何解决这个问题?

【问题讨论】:

  • 您可以发布导致此错误消息的请求网址吗?

标签: c# asp.net-web-api


【解决方案1】:

解决此问题的唯一方法是更改​​其中一个操作的 ActionName 属性。

ASP.NET MVC /Web API 不支持同一控制器中具有相同名称和相同 HTTP 动词的两个操作。

如果您想寻求“黑客解决方案”(我的意见),也可以看看这个问题 (ASP.NET MVC ambiguous action methods)。

【讨论】:

    【解决方案2】:

    为什么不把两个参数都传给同一个动作方法呢?在您的方法中,只需检查它们是否为 null 并对其进行处理。

    使用字符串和整数? (nullable int) 允许两个参数都包含空值。

    这样你就可以使用一个没有任何属性的视图。

    【讨论】:

    • 你说得很好。并不总是解决方案,但在某些情况下可能会起作用。
    【解决方案3】:

    我认为,您应该重新考虑您的端点结构:

    从资源集合中选择一个元素的操作应该沿着资源的键(即唯一的数据库键)执行此操作。此键可以是 int 或 alphanum 类型,但不能同时是这两种类型。

    您可能希望通过一项或两项发现来实现,即建立过滤功能。过滤器参数应作为查询字符串参数传递给 REST 端点。

    例子:

    1. /api/employees → 返回包含所有员工的资源集
    2. /api/employees/5 → 返回单个资源(一名员工)
    3. /api/employees?name=john → 返回包含所有名为“john”的员工的资源集

    示例 3 是一个过滤器,我猜您的发现至少有一个就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多