3

我是 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 () 类型 TaskTrackerService.Controllers.TasksController","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 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 request, CancellationToken cancelToken)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancelToken)"}

4

1 回答 1

4

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

用于这些资源的模型是您对它们有点“ 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 控制器。

于 2014-07-23T13:59:35.923 回答