【发布时间】:2018-01-09 06:40:40
【问题描述】:
我正在尝试让 ASP.NET Core 2 MVC 通过 Startup.cs 中的以下代码基于 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,则在我的FooController : Controller上运行Delete(int id)方法
当我运行该项目时,它似乎没有运行我的任何控制器。我有一些响应的 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<T>?您不能直接路由到通用控制器,因为 Core 在构造期间无法提供类型。您可以将其用作基本控制器,但您必须路由到“实现”该类型的东西,即BarController : FooControlller<Bar>。 -
@ChrisPratt:这是一段伪代码,旨在传达各种控制器将期望不同的 POST 正文模式并接收各自类型的 [FromBody] 参数。我绝对可以将具体类型作为方法参数 - 只是每个类将具有相同的方法名称但期望不同的具体类型。附言我喜欢你的电影(也许你真的是 Chris Pratt?):youtube.com/embed/kj802AGE9Bg?start=22&end=25
标签: asp.net-core-mvc