16

すべてのリクエストの最後にいくつかのアクションを実行しようとしています。テストを行うために新しいプロジェクトを作成したときに生成される Application_Start() を変更しました。

protected void Application_Start()
{
    EndRequest += (s, e) =>
    {
        Console.Write("fghfgh");
    };
    RegisterRoutes(RouteTable.Routes);
}

ラムダは呼び出されません。理由はありますか?

編集: SharpArch [ http://code.google.com/p/sharp-architecture/]で同様のことを行っていることがわかりますが、そこでは機能します...いいえ、HttpModule を使用したくありません.

edit2: 私が見つけた唯一の回避策は、Application_EndRequest を global.asax のプライベート静的メンバーと組み合わせて使用​​することです。

private static WebSessionStorage wss;
protected void Application_Start()
{
    //...
    wss = new WebSessionStorage(this);
    //...
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    wss.EndRequest(sender, e);
}

Application_EndRequest が別のインスタンス オブジェクト (this) を使用して呼び出されているように見えるため、wss はプライベートである必要があります。これは、(最初に説明したように) 私のイベントが呼び出されない理由でもあります。

4

4 に答える 4

18

私は通常、次のことを行います。

protected void Application_EndRequest(object sender, EventArgs e)
{
}

これは期待どおりに機能します。イベントは知らないけど。

于 2009-04-18T22:00:50.323 に答える
15

global.asax ファイルによって表される HttpApplication インスタンスは、最初のHttpApplication オブジェクトのみを表す単一のインスタンスです。HttpApplication のこのインスタンスが他の要求に使用されることは保証されていません。

global.asax の Init() メソッドをオーバーライドし、そのメソッドで必要なイベントをフックする必要があります。

public override void Init() {
    base.Init();

    EndRequest += MyEventHandler;
}

HttpApplication オブジェクトの詳細については、この MSDN の記事を参照してください。

于 2010-01-02T22:05:03.090 に答える
5

あなたの最善の策は、HttpModule でこれを行うことです。HttpModule を使用して、MVC アプリで NHibernate セッションを管理していますが、完全に機能します。begin リクエストで、sessionFactory を ManagedWebSessionContext にバインドし (NHibernate ではかなり文書化されていません)、end リクエストでトランザクションをコミットし、sessionFactory のバインドを解除します。

これも HttpModule に分けた方がきれいだと思います。

于 2009-04-18T22:48:17.090 に答える
0

MVC.net の場合、追加する必要があります。

protected void Application_EndRequest()
{
  Debug.WriteLine("End Request");
}
于 2021-12-29T18:49:45.873 に答える