C# 如何在asp.net mvc中从同一api控制器调用多个GET方法?
我正在使用asp.net mvc5和webapi 2。这是我的示例控制器-C# 如何在asp.net mvc中从同一api控制器调用多个GET方法?,c#,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,http-get,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,Http Get,我正在使用asp.net mvc5和webapi 2。这是我的示例控制器- public class DataFetchController : ApiController { public async Task<HttpResponseMessage> GetDO() { return Request.CreateResponse("ok"); } public async Task<HttpResponseMessage&g
public class DataFetchController : ApiController
{
public async Task<HttpResponseMessage> GetDO()
{
return Request.CreateResponse("ok");
}
public async Task<HttpResponseMessage> GetDoes()
{
return Request.CreateResponse("ok");
}
}
当我运行此项目并尝试浏览“api/DataFetch/getdo”链接时,我遇到一个错误,显示-
{“$id”:“1”,“消息”:“出现错误”
已发生。“,“ExceptionMessage”:“找到多个匹配的操作
请求:\r\n在类型上删除
MagicMeter.Controllers.DataFetchController\r\n类型上的事件
MagicMeter.Controller.DataFetchController,“异常类型”:“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 CancellationToken)\r\n位于
System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()“}
如何解决此问题???尝试将路线配置代码更改为此
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我应该将其添加为new routes.maphttproute还是编辑现有的路由?您可以选择其中之一。如果您想将其添加为新路由,请更改名称,因为已经使用了DefaultAPI。应该注意,这将意味着您的API不是RESTful的。但是由于你的Q已经包含了这个动作,看起来你没有使用REST,所以在这种情况下应该可以。这是因为WebApi中的REST是如何工作的。您不需要像提供的答案所示使用REST(您需要在url中指定操作,而不是http谓词),但是根据问题的路由,
action
由http谓词决定,在本例中是GET
。因为只有一个动词(GET),所以只有一个动作是由名称“GET*”自动决定的(或由标记决定的)。通过使用不同的重载(例如GetAll()
和Get(id)
)可以执行多个操作,但如果它们具有相同的签名,则不能执行。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);