我想基於在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