我想基于在Startup.cs通过下面的代码HTTP动词得到ASP.NET的Core 2 MVC路由的行动:基于HTTP动词的路由动作?
app.UseMvc(routes =>
{
routes.MapRoute(
name: "post",
template: "api/{controller}/{id?}",
defaults: new { action = "Post" },
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("POST") })
);
routes.MapRoute(
name: "delete",
template: "api/{controller}/{id?}",
defaults: new { action = "Delete" },
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("DELETE") })
);
routes.MapRoute(
name: "default",
template: "api/{controller}/{action=Get}/{id?}");
});
也就是说,
- 如果客户端请拨打
GET http://example.com/api/foo
,在我的FooController : Controller
类上运行Get()
方法。 - 如果他们呼叫
GET http://example.com/api/foo/123
,那么在我的FooController : Controller
类上运行Get(int id)
方法。 - 如果他们呼叫
POST http://example.com/api/foo
,那么在我的FooController<T> : Controller
类上运行Post([FromBody] T postedItem)
方法。 - 如果他们呼叫
POST http://example.com/api/foo/123
,那么在我的FooController<T> : Controller
类上运行Post(int id, [FromBody] T postedItem)
方法。 - 如果他们叫
DELETE http://example.com/api/foo/123
,在运行Delete(int id)
方法对我FooController : Controller
当我运行该项目,它似乎并没有运行任何我的控制器。我有一些Razor页面可以响应,但所有基于控制器的路由只返回404路由。即使默认路由似乎不起作用。
我一直在使用https://github.com/ardalis/AspNetCoreRouteDebugger试图帮助我缩小问题的范围,但我仍然没有发现问题。它将控制器上的方法显示为可用操作,但未列出通过MapRoute
添加的任何名称,模板或约束。我很高兴知道任何其他有用的工具。
FWIW,我试图使用相同的动词限制如下: https://github.com/aspnet/Routing/blob/2.0.1/src/Microsoft.AspNetCore.Routing/RequestDelegateRouteBuilderExtensions.cs#L252-L268
什么是'FooController的'?您无法直接路由到通用控制器,因为Core在构建期间无法提供该类型。您可以将其用作基本控制器,但您必须路由到“实现”该类型的内容,即“BarController:FooControlller '。 –
@ChrisPratt:这是一些伪代码,旨在传达各种控制器将期望不同的POST主体架构并接收各自类型的[FromBody]参数。我把把具体类型作为方法参数一定没问题 - 只是每个类都有相同的方法名称,但期望不同的具体类型。附:我喜欢你的电影(也许你真的是克里斯普拉特?):https://www.youtube.com/embed/kj802AGE9Bg?start=22&end=25 – steamer25