ASP.Net Web API控制器中是否可以有多个Get方法?

6

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

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

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

我考虑通过以下示例格式“//localhost:2342/”调用操作方法,其中不包含操作方法名称。


2
暂且忘记它们是动作方法。无论如何,你不能在一个类中拥有这两个方法,因为它们具有相同的签名。 - Andrew Barber
请查看以下链接: https://dev59.com/O3DXa4cB1Zd3GeqP8hyt - Ivan
2个回答

7
基本上,你不能这样做,原因是两种方法具有相同的名称和完全相同的签名(相同的参数数量和类型),这将无法在C#中编译,因为C#不允许这样做。
现在,使用Web API,如果你有两个具有相同操作的方法(都是GET),并且具有相同的签名(int,User),当你尝试从客户端(如Javascript)点击其中一个时,ASP.NET将尝试将传递的参数类型与方法(操作)匹配,由于两者具有完全相同的签名,它将失败并引发关于歧义的异常。
所以,你可以为你的方法添加ActionName属性来区分它们,或者使用Route属性并为你的方法提供不同的路由。
希望这可以帮助你。

请查看我的问题 - Moeez

3

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

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]


为什么您将默认路由配置显示为解决方案? - Elisabeth
3
投票负面了。默认的WebAPI路由配置默认情况下没有动作参数,只有"api/{controller}/{id}"。添加{action}实际上允许多个GET方法,这正是OP想要的。 - Ricky S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接