2011-01-07 9 views
3

私は少しネットに新しいですし、いくつかの概念を把握しようとしています。.net MVC 3リクエストイベント

私はColdFusionでしばらく書いていますが、CFにはonRequest()というApplication.cfcの下にイベントがあり、ページがあるたびに起動します。

リクエスト情報をキャプチャするのに.netの何が使用されていますか?

さらに、自分のイベントを起動させるためにRequestイベントをラッチしたり延長したりする方法はありますか?

答えて

4

のようなものがあり、と呼ばれるものが欲しいでしょう。のアクションがヒットします。あなたが次のことを行うことができ、現在の要求にアクセスするには

protected virtual void OnActionExecuting(ActionExecutingContext filterContext) { 
    //Do the default OnActionExecuting first. 
    base.OnActionExecuting(filterContext); 

    //The request variable will allow you to see information on the current request. 
    var request = filterContext.RequestContext.HttpRequest; 
} 

あなたは内のすべてのコントローラにこれをアクセスしたい場合、あなたはおそらくベースコントローラを作成する必要があり、そこにこれを追加します。

public class BaseController : Controller 
{ 
    //Code above 
} 

そして、あなたのホームコントローラで:

public class HomeController : BaseController 
{ 
} 
+1

いいえ、すべてのコントローラーで使用する場合は、グローバルアクションフィルターを使用する必要があります。コンポジション>継承。 – Ryan

+0

@ライアン - ギャングオブフォー以外のものは読んでいますか?私は、グローバルなアクションフィルタは、多くの状況で過度の攻撃であると主張します。 –

+0

私はちょうど個人的な経験から話しています。私のアドバイスは、何があなたのために働くのか把握するためにさまざまな方法で試してみることです。 – Ryan

6

あなたはまた、Global.asaxのファイルを見つけることができますし、(たとえばBeginRequest用)HttpApplicationクラスのイベントのいずれかを使用します。

http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx

HttpApplicationRequestです。

コントローラ(画像、CSS、間違ったアドレス)に関連するだけでなく、そこにあるすべてのリクエストをキャッチできます。あなたはGlobal.asaxファイル内のコードを記述したくない場合は

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_BeginRequest(object sender, EventArgs e) 
    {   
     //Request.Have_fun 
    }  
} 

は、あなたが HttpModuleを使用することを検討すべきです。

このサンプルコードを使用して新しいクラスを作成します。

using System; 
using System.Web; 

namespace MyProject 
{ 
    public class MyHttpModule : IHttpModule 
    { 
     public void Init(HttpApplication application) 
     { 
      application.BeginRequest += ApplicationBeginRequest; 
      application.EndRequest += ApplicationEndRequest; 
     } 

     private void ApplicationEndRequest(object sender, EventArgs e) 
     { 
      //do something here with HttpContext.Current.Request 
     } 

     private static void ApplicationBeginRequest(Object source, EventArgs e) 
     { 
      //do something here with HttpContext.Current.Request 
     } 


     public void Dispose() 
     { 
     } 
    } 
} 

はweb.configファイルで(登録HttpModuleを)2つのエントリを追加:

<system.web> 
    <httpModules> 
    <add name="MyHttpModule" type="MyProject.MyHttpModule" /> 
    </httpModules> 
</system.web> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="MyHttpModule" type="MyProject.MyHttpModule" /> 
    </modules> 
</system.webserver> 

ためIIS7の変化を(加算system.webServer部) web.configに2つのエントリを追加する必要があります。

+0

LukLedあなたは私のためにHttpModuleで少し詳しく教えてもらえますか? – jcreamer898

+0

@ jcreamer898:HttpModuleを作成するためのコードをいくつか追加しました。あなたはまた、Googleで多くのチュートリアルを見つけることができます。 – LukLed

+0

これは、MVCのかなり重い手のアプローチです。 ASP.NET MVCでは、OnActionExecutingやアクションフィルターは、他の答えが示唆しているように、より良いアプローチです。 –

1

ASP.NET MVC 3で作業している場合は、ASP.NETアプリケーション/リクエストスタックに直接タップするのではなく、グローバルアクションフィルタを使用することをお勧めします。

関連する問題