ASP.NET Web API操作 - 每个控制器只有一个GET?

时间:2013-03-08 20:43:01

标签: asp.net-web-api

我是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]属性以及从方法名称中删除“获取”以便它只是Pending,那么它就可以工作。

只要有两个get方法,我就会收到此错误:

{“Message”:“发生了错误。”,“ExceptionMessage”:“找到了与请求匹配的多个操作:\ r \ nSystem.String TodaysTasks()类型为TaskTrackerService.Controllers.TasksController \ r \ nSystem .String PendingTasks()类型为TaskTrackerService.Controllers.TasksController“,”ExceptionType“:”System.InvalidOperationException“,”StackTrace“:”at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\ r \在System.Web.Http.Dttpatcher的System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\ r \ n中的System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)\ r \ n .HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage请求,CancellationToken cancellationToken)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage请求,CancellationToken)的CancellationToken)“}

1 个答案:

答案 0 :(得分:4)

Web API背后的想法是它代表ReSTful resource。 ReST的语义意味着控制器符合' resource'的概念。并且该行为由用于访问资源的HTTP动词确定 - 意味着GET,POST,PUT,DELETE,......

用于这些资源的模型是你稍微对待它们" CRUD - y&#34 ;;你查询资源的元素,将新元素放入资源,更新资源中的元素 - 你明白了。

对于每个(相关的)动词,您应该只有一个动作来处理这种性质的请求。通过GET访问多个操作的想法并不是非常好的,而且更像是一种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控制器。