2016-04-19 19 views
1

ActionおよびControllerの名前をASP.Net MVC Core RC1に登録する方法Startup.csにお申し込みくださいか?ASP.Net Core MVCアプリケーションでアクションとコントローラの名前を取得するには?

私はstartup.csconfigure方法でコードを実行した後(私は私のデータベースに詳細な応答をログに記録したいので、私はアクションやコントローラの情報を必要とする。)ミドルウェアを作成し、情報をログに記録したい -

app.UseMvc(routes => 
{ 
    routes.MapRoute(
      name: "default", 
      template: "{controller=User}/{action=Index}/{id?}"); 
}); 

//Want to get Action and controller names here.. 
+0

私は、あなたが 'ミドルウェア'を追加することはできませんそれを行うには、 'ルートミドルウェア'をオーバーライドする必要があると思う、それは呼び出されません。 –

+0

@aguafrommars、あなたはあなたのポイントを詳述できますか? – ramiramilu

+0

@Clint Bによって掲示されたコードを読んだら、あなたは彼の 'ミドルウェア'を使うことができます。スタックで 'UseMcv'の前に使用する必要があります。これは応答時に機能します。 –

答えて

0

これは、私がカスタム例外ハンドラミドルウェアで行う方法です。

using System.Diagnostics; 

frame = new StackTrace(e, true).GetFrame(0); 
controller = frame.GetMethod().DeclaringType.FullName; 
action = frame.GetMethod().ToString(); 

あなたはミドルウェアのプロジェクトをチェックアウトしたい場合は、ここにリンク CustomExceptionHandler

EDITです:あなたはまた、アクションフィルタであなたのロギングを行うことができ
が。アクションフィルターのOnActionExecuting()メソッドには、ActionExecutingContextパラメーターがあります。このパラメータを使用すると、リクエストに関するすべての種類の情報を取得できます。以下はコントローラとアクション名を取得する方法です。また、私は応答性を助けるために別のスレッドでそれを行うことをお勧めします。

public override void OnActionExecuting(ActionExecutingContext context) 
{ 
    var t = Task.Run(() => { 
     controller = context.Controller.ToString(); 
     action = context.ActionDescriptor.Name; 

     //Log to DB 
    } 
} 
+0

私はこのオプションを検討しています。私が直面している唯一の問題は何か他のものです。ミドルウェアのコードがWEB API呼び出しのために起動していません。あなたは何か考えていますか? – ramiramilu

+0

ミドルウェアのInvoke()メソッドが呼び出されていないと言っていますか?このメソッドは、リクエストごとに呼び出されます。 –

+0

invokeメソッドは特定のURLに対してのみ呼び出されますが、すべてではありません。特に、Web Apiエンドポイントでは呼び出されません。私は新しいソリューションを作り、それを試してみます。私はあなたに私の発見を知らせます。 – ramiramilu

2

あなたのミドルウェアにIActionDescriptorCollectionProviderサービスを注入したいと思うでしょう。これから、プロパティActionDescriptors.Itemsを使用して、そのアクションのすべてのルート値を持つActionDescriptorのリストを取得できます。それをControllerActionDescriptorにキャストすると、ControllerNameActionNameにアクセスできます。

関連する問題