2017-12-27 34 views
0

私はルートにStartup.csに次のコードを介したHTTP動詞に基づいてアクションをASP.NET MVC 2のコアを取得しようとしている: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?}"); 
     }); 

すなわち、

  • クライアントの場合私のFooController : Controllerクラスでメソッドを実行するGET http://example.com/api/fooを呼び出します。
  • 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を呼び出すと、Post(int id, [FromBody] T postedItem)メソッドがFooController<T> : Controllerクラスで実行されます。私はプロジェクトを実行すると、私のコントローラのいずれかを実行していないように私FooController : Controller

Delete(int id)メソッドを実行します

  • 彼らはDELETE http://example.com/api/foo/123を呼び出す場合は、。私はいくつかの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

  • +0

    'FooController は'何ですか?コアは構築中に型を提供する方法がないため、ジェネリックコントローラに直接ルーティングすることはできません。ベースコントローラーとして使用することはできますが、タイプを「実装する」もの、つまりBarController:FooControlller にルーティングする必要があります。 –

    +0

    @ChrisPratt:これは、さまざまなコントローラが異なるPOSTボディスキーマを期待し、それぞれのタイプの[FromBody]引数を受け取ることを伝えるための擬似コードです。メソッドのパラメータとして具体的な型を入れることは間違いありません。各クラスは同じメソッド名を持ちますが、異なる具体的な型が必要です。 P.S.私はあなたの映画が大好きです(おそらくあなたはChris Prattですか?):https://www.youtube.com/embed/kj802AGE9Bg?start=22&end=25 – steamer25

    答えて

    0

    だから私は問題があることが判明し、正確に何を覚えていませんが、メタソリューションを使用すると、ルーティングをデバッグすることができるということですログレベルを「情報」から「デバッグ」に増やすことで問題が発生します。例えば、appsettings.json経由:

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

    ...そしてあなたは、例えばこのようなメッセージを取得します、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) 
    
    関連する問題