【问题标题】:ASP.NET Web API actions - only one GET per controller?ASP.NET Web API 操作 - 每个控制器只有一个 GET?
【发布时间】:2013-03-08 20:43:01
【问题描述】:

我是 ASP.NET Web API 的新手,但我遇到了一个问题,即如果我尝试将两个 get 方法添加到单个控制器,则无法尝试获取操作。除非我们添加相同方法的重载,否则每个控制器是否只允许一次获取?

如果我只有一个 get 方法,这可行,例如第一个。一旦我将 Get 添加到第二个方法名称,它就会给我一个 500。

[HttpGet]
public string GetToday()
{
    return "Hello today";
}

[HttpGet]
public string GetPending()
{
    return "Hello Pending";
}

我正在拨打的电话: http://abc.com/api/tasks/gettoday http://abc.com/api/tasks/getpending

如果方法名称只是“今天”,我可以进行此调用,只要我输入 [HttpGet] 属性即可。但前提是我没有第二个动作。这意味着如果我从第二种方法中删除 [HttpGet] 属性,并从方法名称中删除 'Get' 使其只是待处理,那么它就可以工作。

只要有两种获取方法,我就会收到此错误:

{"Message":"发生错误。","ExceptionMessage":"找到与请求匹配的多个操作:\r\nSystem.String TodaysTasks() on type TaskTrackerService.Controllers.TasksController\r\nSystem .String PendingTasks() on type TaskTrackerService.Controllers.TasksController","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\ n 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancelToken)\r\n 在 System.Web.Http.Dispatcher .HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage 请求, CancellationToken cancelToken)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage 请求, CancellationToken取消令牌)"}

【问题讨论】:

  • 您可以根据需要进行任意数量的操作。可以贴代码吗?
  • 您能展示一下您正在尝试的操作吗?您只能拥有一个具有相同方法签名的 GET,但可以拥有具有不同名称或签名(以及指向它们的路由)的任意数量的操作
  • 请发布一些代码显示您的控制器操作和您的路由配置
  • 这是 ASP.NET Web API 而不是 MVC,所以我会这样编辑问题。
  • 我想通了 - 默认配置是 webapiconfig 而不是 routeconfig,它有 api/{controller}/{id} 而不是 {controller}/{action}/{id}。当我在那里添加动作时,效果很好。现在说得通了。谢谢!

标签: asp.net-web-api


【解决方案1】:

Web API 背后的想法是它代表ReSTful resource。 ReST 的语义意味着控制器对应于“resource”的概念,并且该行为由用于访问资源的 HTTP 动词决定——意味着 GET、POST、PUT、DELETE ......

用于这些资源的模型是您对它们有点“CRUD-y”;您查询资源的元素,将新元素放入资源中,更新资源中的元素 - 你明白了。

对于每个(相关)动词,您应该只有一个操作来处​​理这种性质的请求。通过 GET 访问多个操作的想法不是很 ReSTful,更像是一种 MVC-ish RPC 风格的思维模式,不适合 ASP.NET Web API。

所以你的控制器可能改为:

public class FooController : ApiControlle
{
    [HttpGet]
    public Account Get(string flavour)
    {
        switch (flavour) {
            case "greeting": return "Hello today";
            case "pending": return "Hello Pending";
            default: throw new InvalidOperationException("Cannot get your flavour of foo :(");
        }
    }
}

但正如您在评论中所写,问题在于您从未打算将控制器用作 Web API 控制器,而是 MVC 控制器。

【讨论】:

  • 我会把这个留给其他人,他们和我一样,在搜索类似但与 Web API 相关的问题时遇到了这个问题。
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多