【问题标题】:WebApi Routing: api/{controller}/{id} and api/{controller}/{action} at the same timeWebApi路由:同时api/{controller}/{id}和api/{controller}/{action}
【发布时间】:2016-04-15 12:13:49
【问题描述】:

我有默认的 webapi 路由配置:

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

我想支持以下场景:

//api/mycontroller
public IQueryable<MyDTO> Get();

//api/mycontroller/{id} where id can be anything except "customaction1" and "customaction2"
public HttpResponseMessage Get(string id);

//api/mycontroller/customaction
[HttpPost]
public void CustomAction1([FromBody] string data);
[HttpPost]
public void CustomAction2([FromBody] string data);

我尝试将[Route("api/mycontroller/customaction1")] 应用于CustomAction1 方法,类似于CustomAction2,但得到:

找到多个与请求匹配的操作: MyProject.WebApiService.MyController 类型上的 CustomAction1 MyProject.WebApiService.MyController 类型上的 CustomAction2

【问题讨论】:

  • 你配置属性路由了吗? config.MapHttpAttributeRoutes()
  • 不。尝试过并且有效。我会接受的是asnwer。但是可以配置路由,使其默认使用没有属性的自定义操作?
  • 您必须创建更多路线

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


【解决方案1】:

确保您在默认配置中配置了属性路由

//....
config.MapHttpAttributeRoutes()

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

如果你想用 out 属性路由做同样的事情,那么你需要显式配置路由

//This one constrains id to be an int
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action="Get", id = RouteParameter.Optional },
    constraints : new { id = @"\d" }
);
//This one should catch the routes with actions included
config.Routes.MapHttpRoute(
    name: "ActionRoutes",
    routeTemplate: "api/{controller}/{action}"
);

【讨论】:

  • 好吧,在我的例子中,id 是除了动作名称之外的任何字符串
  • 哦,我错过了。以为是int。这确实改变了事情。我将不得不重新检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多