0

一部の処理のために IIS モジュールを追加する必要があります。これが私のモジュールです:

namespace MyNamespace
{
    public class MyModule : IHttpModule
    {
        #region IHttpModule Members

        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            //I hope to do some work here ONLY once for all requests

            context.ReleaseRequestState += new EventHandler(myHandler);
        }

        #endregion

        public void myHandler(Object source, EventArgs e)
        {
            //do some work...
        }
    }
}

Init() メソッドでリソースを消費する作業を行う必要があります。Init が Web サイトで一度だけ呼び出され、IIS マネージャーで Web サイトが再起動されたときにのみ再度呼び出されることを願っています。

これの専門家は、Init() が期待どおりに機能するかどうかを教えてもらえますか?

ありがとう!

4

1 に答える 1

1

実行中のすべてのリクエストに対して、常にこのメソッドが呼び出されるため、アプリ プールがスピンアップするのはこれが初めてではありません。あなたがやりたいことは、静的変数をそこに置いて、それが本当に最初にヒットしたかどうかを確認し、そうでない場合は必要なものを続行することです。それ以外の場合は無視します。変数を true に設定するときは、コードの一部を確実にロックしてください。

IIS には、Web サイトが使用するアプリケーション プールがあることを思い出してください (一般的に言えば)。処理するために IIS に複数の同時要求が送信されますが、何が起こりますか? アプリケーション プールは Web サイトへの要求を処理するために実行されるため、HttpModule の Init() に対して複数の「ヒット」が実行されますが、それが理にかなっている場合は、アプリケーションごとに 1 回実行されます。

それらのすべてが、モジュールの独自のリストを初期化します。

グローバル asax で Application_Start イベントを使用するオプションがあります。これは、アプリケーションごとに 1 回だけ実行されます (アプリケーション プールがスピンアップし、要求が送信されたとき)。おそらく、これをニーズに合わせて使用​​できます。より良いオプション。

于 2015-09-11T15:56:01.210 に答える