【发布时间】:2013-04-25 18:43:20
【问题描述】:
我在 MSDN 上浏览了 this document 并想不出答案。
考虑到我有这样定义的路线:
config.Routes.MapHttpRoute(
name: "DefaultWithActionAndID",
routeTemplate: "v{version}/{controller}/{action}/{id}",
defaults: null,
constraints: new {
action = @"[a-zA-Z]+",
id = @"\d+"
}
);
config.Routes.MapHttpRoute(
name: "DefaultWithID",
routeTemplate: "v{version}/{controller}/{id}",
defaults: null,
constraints: new {
id = @"\d+"
}
);
config.Routes.MapHttpRoute(
name: "DefaultWithoutActionOrId",
routeTemplate: "v{version}/{controller}",
defaults: null,
);
现在我有两个如下所示的控制器:
public class ItemController:ApiController{
[HttpGet]
public Item Get(int id){}
[HttpGet]
public Item GetSomething(int id){}
[HttpPut]
public Item Put(Item newItem){}
}
public class AnotherController:ApiController{
[HttpPut]
public HttpResponseMessage Put(Something item){}
}
我希望能够像这样调用所有这些端点:
GET /api/Item/344
GET /api/Item?id=344
GET /api/Item/Something/2334
GET /api/Item/Something?id=2334
PUT /api/Item body={newItem}
PUT /api/Another body={newSomething}
这将起作用,但前提是我将“Get”添加为默认操作名称。如果我没有在我的路由中指定默认操作名称,那么它会抱怨多个匹配的操作名称。如果我确实添加了默认操作名称,那么我无法在没有错误的情况下调用 PUT 到 Put() 方法,因为操作名称与默认值不匹配并且找不到。
// Will work in some cases, but not all
config.Routes.MapHttpRoute(
name: "DefaultWithID",
routeTemplate: "v{version}/{controller}/{id}",
defaults: new {
action="Get",
id=RouteParameters.Optional
},
constraints: new {
id = @"\d+"
}
);
// Works
GET /api/Item/344
GET /api/Item?id=344
GET /api/Item/Something/2334
GET /api/Item/Something?id=2334
// Doesn't work
PUT /api/Item body={newItem}
PUT /api/Another body={newSomething}
如果在尝试使用之前存在,我如何告诉路由使用名称与我的 HTTP 动词匹配的操作
【问题讨论】:
-
请包含“如果我添加默认操作名称...”的代码。
-
为什么不把
Something放到另一个控制器里? -
用失败案例的更多细节更新了问题。问题似乎是路由没有额外的优先级(寻找与 HTTP 动词或
{verb}{controller}模式匹配的方法名称,就像 MVC 一样)。实际上,{verb}令牌将是一个很好的补充。
标签: c# asp.net-web-api asp.net-mvc-routing asp.net-web-api-routing