2017-12-27 7 views
0

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 die Get() Methode auf meiner FooController : Controller Klasse ausgeführt wird.
  • Wenn sie GET http://example.com/api/foo/123 rufen, das läuft die Get(int id) Methode auf meine FooController : Controller Klasse.
  • Wenn sie POST http://example.com/api/foo rufen, das läuft die Post([FromBody] T postedItem) Methode auf meine FooController<T> : Controller Klasse.
  • Wenn sie POST http://example.com/api/foo/123 aufrufen, läuft die Post(int id, [FromBody] T postedItem) Methode auf meiner FooController<T> : Controller Klasse.
  • Wenn sie DELETE http://example.com/api/foo/123 rufen, das läuft die Delete(int id) Methode auf meinem FooController : 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

+0

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 ". –

+0

@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

Antwort

0

So erinnere ich mich nicht mehr genau, was das Problem entpuppte sich aber die Meta-Lösung ist, dass Sie Routing debuggen Probleme durch Erhöhung der Log-Level von "Information" zu "Debug". Zum Beispiel über appsettings.json:

{ 
    "Logging": { 
    "Debug": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    }, 
    "Console": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    } 
    } 
} 

... dann werden Sie erhalten Nachrichten wie diese in zum Beispiel des Anwendungsausgabefenster von Visual Studio:

[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteConstraintMatcher[1] 
     Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
Microsoft.AspNetCore.Routing.RouteConstraintMatcher:Debug: Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteBase[1] 
     Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
Microsoft.AspNetCore.Routing.RouteBase:Debug: Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Debug: Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
Verwandte Themen