我正在尝试实现三种方法控制器
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
public IEnumerable<string> Get(int id)
{
return new string[] { "sa1", "sa2" };
}
[HttpGet]
public IEnumerable<string> password()
{
return new string[] { "password", "password" };
}
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
但是当我尝试拨打http://localhost:49365/api/mycontrollername/password
它始终显示请求无效。
答案 0 :(得分:0)
我怀疑它正在尝试拨打Get(int id)
,然后尝试传递密码&#34;密码&#34;作为整数参数。从我可以回想起它的结果是,当你发出GET请求时,它会寻找一个名为Get
的方法。在这种情况下,它找到一个。然后根据路由,即在控制器名称出现ID之后,它会查看URL的下一部分,在这种情况下&#34;密码&#34;,然后将其用作{{1}的值}参数。
如果您要删除这两种id
方法,您可能会发现您的网址有效,但如果您添加其他Get
方法,则会遇到与&#34相关的其他问题;找到多个操作& #34 ;.如果您决定需要多个HttpGet
方法,以下讨论可能会有所帮助:
答案 1 :(得分:0)
如果你想调用像"http://localhost:49365/api/mycontrollername/password"
您必须在控制器上添加ActionName属性并在Routeconfig.cs上添加路由;
这是示例
[ActionName("GetEmployees")]
public IEnumerable<Employee> GETEmployees()
{
return _db.Employees.AsNoTracking();
}
routes.MapRoute(
name: "Default",
url: "api/{controller}/{action}/{id}",
defaults: new { controller = "Employees", action = "GetEmployees", id = UrlParameter.Optional }
);