Ich versuche, die Aktion ASP.NET Core 2 MVC Route zu erhalten, basierend auf dem HTTP-Verb über den folgenden Code in Startup.cs:Route Aktion basierend auf HTTP Verb?
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?}");
});
Ie,
- Wenn der Client ruft
GET http://example.com/api/foo
, dass dieGet()
Methode auf meinerFooController : Controller
Klasse ausgeführt wird. - Wenn sie
GET http://example.com/api/foo/123
rufen, das läuft dieGet(int id)
Methode auf meineFooController : Controller
Klasse. - Wenn sie
POST http://example.com/api/foo
rufen, das läuft diePost([FromBody] T postedItem)
Methode auf meineFooController<T> : Controller
Klasse. - Wenn sie
POST http://example.com/api/foo/123
aufrufen, läuft diePost(int id, [FromBody] T postedItem)
Methode auf meinerFooController<T> : Controller
Klasse. - Wenn sie
DELETE http://example.com/api/foo/123
rufen, das läuft dieDelete(int id)
Methode auf meinemFooController : Controller
Als ich das Projekt ausführen, scheint es keine meiner Controller auszuführen. Ich habe einige Razor-Seiten, die antworten, aber alle Controller-basierten Routen geben einfach 404 zurück. Nicht einmal die Standardroute scheint zu funktionieren.
Ich habe https://github.com/ardalis/AspNetCoreRouteDebugger benutze ich, um zu versuchen und helfen Sie die Frage zu verengen, aber ich finde immer noch nicht das Problem. Sie zeigt die Methoden auf den Controllern als verfügbare Aktionen an, führt jedoch keine der über MapRoute
hinzugefügten Namen, Vorlagen oder Einschränkungen auf. Ich würde froh sein, von irgendwelchen anderen hilfreichen Werkzeugen auch zu wissen.
FWIW, ich versuche, die gleichen Verb Einschränkungen wie hier zu verwenden: https://github.com/aspnet/Routing/blob/2.0.1/src/Microsoft.AspNetCore.Routing/RequestDelegateRouteBuilderExtensions.cs#L252-L268
Was ist 'FooController'? Sie können nicht direkt zu einem generischen Controller routen, da Core den Typ während der Erstellung nicht bereitstellen kann. Sie können es als Basis-Controller verwenden, aber Sie müssten zu etwas "routen", das den Typ "implementiert", also "BarController: FooController ". –
@ChrisPratt: Das ist ein bisschen Pseudo-Code, der vermitteln soll, dass die verschiedenen Controller verschiedene POST-Body-Schemas erwarten und [FromBody] -Argumente der jeweiligen Typen erhalten. Ich bin definitiv damit einverstanden, konkrete Typen als Methode param zu verwenden - es ist nur so, dass jede Klasse den gleichen Methodennamen hat, aber einen anderen konkreten Typ erwartet. P.S. Ich liebe deinen Film (vielleicht bist du wirklich Chris Pratt?): Https://www.youtube.com/embed/kj802AGE9Bg?start=22&end=25 – steamer25