2013-03-08 66 views
3

我是新来的ASP.NET Web API,但我遇到了一个问题,如果我试图将两个get方法添加到单个控制器它尝试获取操作失败。我们是否只允许每个控制器获取一个,除非我们正在添加相同方法的重载?ASP.NET Web API操作 - 每个控制器只有一个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',所以它只是待定,然后它就可以工作。

只要有两个get方法我得到这个错误:

{“消息”:“发生错误”,“ExceptionMessage”:“找到了多个行动相匹配的要求,即:\ r \ SystemString 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 \ n at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\ r \ n at System.Web.Http.ApiController.ExecuteAsync( HttpControllerContext controllerContext,Cancell ationToken cancellationToken)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage请求,CancellationToken cancellationToken)上的System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage请求,CancellationToken cancellationToken)\ r \ n“ }

+1

您可以根据需要进行多项操作。你可以发布代码吗? – jchapa 2013-03-08 20:43:53

+2

你可以显示你正在尝试的操作吗?您只能拥有一个具有相同方法签名的GET,但具有各种名称或签名(以及指向它们的路由)的任何数量的操作 – 2013-03-08 20:44:20

+2

请张贴一些代码来显示您的控制器操作和您的路由配置 – levelnis 2013-03-08 20:45:40

回答

4

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

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

对于每个(相关的)动词,您应该只有一个处理该性质请求的动作。通过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控制器。

+0

我会在这里为其他人和我一样,在寻找类似的,但与Web API有关的麻烦时遇到这个问题。 – Cornelius 2014-07-23 13:59:56

相关问题