问题背景:
我的WebApi中有一个控制器,它有两个操作方法。这两个动作方法都是GET并且没有参数。
一个操作方法名为'GetMessages',另一个名为'GetEmployeeList'。
问题:
以下是我的控制器中的操作方法:
[HttpGet]
public string GetMessages()
{
return "Get Messages Endpoint";
}
[HttpGet]
public string GetEmployeeList()
{
return "Get Employees Endpoint";
}
这些是我用WepApiConfig设置的海关路线
config.Routes.MapHttpRoute(
name: "Messages",
routeTemplate: "v2/api/People/{action}/{id}",
defaults: new { action = "GetMessages", id = RouteParameter.Optional });
config.Routes.MapHttpRoute(
name: "Employees",
routeTemplate: "v2/api/People/{action}/{id}",
defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional});
当我打电话给pf以下网址时:
/v2/api/People/GetMessages
/v2/api/People/GetEmployeeList
我收到以下异常消息,指出多个操作与URL请求匹配:
Multiple actions were found that match the request: System.Net.Http.HttpResponseMessage GetMessages() on type Persons.PeopleController System.Net.Http.HttpResponseMessage GetEmployeeList() on Persons.PeopleController
我如何纠正这一点,以便我一起使用两个具有相同签名的GET动作方法?
答案 0 :(得分:3)
我可能不明白这一点,但为什么不简单地调整这样的路线(请注意路线模板中的动作名称):
config.Routes.MapHttpRoute(
name: "Messages",
routeTemplate: "v2/api/People/GetMessages/{id}",
defaults: new { action = "GetMessages", id = RouteParameter.Optional });
config.Routes.MapHttpRoute(
name: "Employees",
routeTemplate: "v2/api/People/GetEmployeeList/{id}",
defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional});
但是我宁愿选择更通用的选项:
config.Routes.MapHttpRoute(
name: "People",
routeTemplate: "v2/api/People/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
通过这种方式,您可以使用单一路线覆盖这两个操作。有没有理由不选择这个选项?
答案 1 :(得分:1)
你不需要有两条路线。一个就够了。尝试将路线更改为以下内容。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您可以尝试单独指定路线,但不一定要这样做。确保您对网络API的调用100%正确。
答案 2 :(得分:0)
如何分别为每种方法指定路线?
[RoutePrefix("api/people")]
public class MyController : ApiController
{
[HttpGet]
[Route("messages")]
public string GetMessages()
{
return "Get Messages Endpoint";
}
[HttpGet]
[Route("employees")]
public string GetEmployeeList()
{
return "Get Employees Endpoint";
}
}
所以你会得到像你的网址
/v2/api/people/messages
/v2/api/people/employees
其中IMHO看起来比你的例子更加RESTful