【问题标题】:Can I have Multiple Get Methods in ASP.Net Web API controller我可以在 ASP.Net Web API 控制器中有多个获取方法吗
【发布时间】:2014-11-17 11:10:34
【问题描述】:

我想实现多个 Get 方法,例如:

Get(int id,User userObj)Get(int storeId,User userObj)

是否可以这样实现,我不想更改操作方法名称,因为在这种情况下我需要在 URL 中输入操作名称。

我正在考虑通过这种示例格式“//localhost:2342/”来执行操作方法 其中不包含操作方法名称。

【问题讨论】:

标签: c# asp.net-web-api asp.net-web-api-routing


【解决方案1】:

基本上你不能这样做,原因是这两个方法具有相同的名称和完全相同的签名(相同的参数编号和类型),这不会用 C# 编译,因为 C# 不允许这样做。

现在,使用 Web API,如果您有两个方法具有与示例相同的操作(都是 GET),并且具有相同的签名(int,User),当您尝试从客户端访问其中一个时(就像来自 Javascript),ASp.NET 将尝试将传递的参数类型与方法(操作)相匹配,并且由于两者都有确切的签名,因此它将失败并引发关于歧义的异常。

因此,您可以将 ActionName 属性添加到您的方法中以区分它们,或者您使用 Route 属性并为您的方法提供不同的路由。

希望对您有所帮助。

【讨论】:

【解决方案2】:

您需要在 路由模板 中添加 action 名称,以在 ASP.Net Web API 控制器中实现多个 GET 方法。

WebApiConfig:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new {id = RouteParameter.Optional }
);  

控制器:

public class TestController : ApiController
{
     public DataSet GetStudentDetails(int iStudID)
     {

     }

     [HttpGet]
     public DataSet TeacherDetails(int iTeachID)
     {

     }
}

注意:动作/方法名称应以'Get'开头,否则需要在动作/方法上方指定[HttpGet]

【讨论】:

  • 为什么将默认路由配置显示为解决方案?
  • 糟糕的否决票。默认的 WebAPI 路由配置默认没有操作参数,只有“api/{controller}/{id}”。添加 {action} 实际上允许多个 GET 方法,这是 OP 想要的。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2019-01-04
相关资源
最近更新 更多