httpモジュールを作成していて、デバッグ中に、最初は(少なくとも)奇妙な動作のように見える何かに気づきました。
httpmoduleのinitメソッドにブレークポイントを設定すると、デバッグのためにWebサイトを起動して単一の要求を行っただけなのに、 http module initメソッドが数回呼び出されていることがわかります(1回だけヒットすることもあります)。 、他の場合は10倍)。
HttpApplicationの複数のインスタンスが実行され、httpモジュールごとに作成されることを期待する必要があることはわかっていますが、単一のページを要求すると、単一のhttpアプリケーションオブジェクトによって処理されるため、関連付けられたイベントは1回だけ発生します。ただし、リクエストごとにイベントを数回発生させますが、これは意味がありません。ただし、そのhttpApplication内に複数回追加されている必要があります。つまり、毎回呼び出されるのと同じhttpmodule initメソッドであり、新しいhttpアプリケーションではありません。ブレークポイントに到達するたびに作成されます(下部のコード例などを参照してください)。
ここで何がうまくいかない可能性がありますか?デバッグしていて、httpモジュールにブレークポイントを設定しているからですか?
デバッグのためにWebサイトを起動し、httpmoduleのブレークポイントをすばやくステップオーバーすると、initメソッドが1回だけヒットし、eventhandlerにも同じことが当てはまるようです。代わりに、ブレークポイントで数秒間ハングさせた場合、initメソッドが数回呼び出されます(ブレークポイントをステップオーバーするまでの待機時間によって異なるようです)。これは、httpmoduleが初期化され、httpアプリケーションが要求を処理できることを確認するための組み込み機能である可能性がありますが、壊滅的な結果をもたらす可能性があるもののようにも見えます。
リクエストを終了しようとしている可能性があり、ブレークポイントを設定したため、問題が発生したと見なしてinitメソッドを再度呼び出そうとするため、これは論理的に見える可能性があります。リクエストを処理できますか?
しかし、これは起こっていることであり、すべてがうまくいっていますか(私は推測しています)、それとも本当の問題ですか?
私が特に懸念しているのは、何かが「本番/ライブ」サーバーで数秒間ハングする場合、initを介して多くのイベントハンドラーが追加されるため、ページへの各リクエストが突然イベントハンドラーを数回起動することです。
この動作により、サイトがすぐにダウンする可能性があります。
私はformsauthenticationやrolemanagermoduleなどのhttpmodulesに使用される「元の」.netコードを見てきました...しかし、私のコードはそれらのモジュールが使用するものと何ら変わりはありません。
私のコードは次のようになります。
public void Init(HttpApplication app)
{
if (CommunityAuthenticationIntegration.IsEnabled)
{
FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];
formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
}
}
.NETFrameworkのRoleManagerModuleでどのように実行されるかの例を次に示します。
public void Init(HttpApplication app)
{
if (Roles.Enabled)
{
app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
app.EndRequest += new EventHandler(this.OnLeave);
}
}
誰かが何が起こっているのか知っていますか?
(私はただ誰かがこれが起こっている理由を教えてくれて、すべてが完全にうまくいくことを私に保証してくれることを願っています):)
アップデート:
私は問題を絞り込もうとしましたが、これまでのところ、呼び出されているinitメソッドは常にhttpモジュールの新しいオブジェクト上にあることがわかりました(以前考えていたのとは逆です)。
最初のリクエスト(サイトの起動時)では、作成されているすべてのHttpApplicationオブジェクトとそのモジュールがすべて最初のリクエストを処理しようとしているため、追加されているイベントハンドラーにヒットしているようです。なぜこれが起こっているのか本当に理解できません。
別のページをリクエストすると、作成されたすべてのHttpApplication(およびそれらのモジュール)が再度リクエストを処理しようとし、イベントハンドラーに複数回ヒットします。
しかし、最初のページ(または別のページ)に戻ると、1つのHttpApplicationのみが要求の処理を開始し、すべてが期待どおりに行われるようです-ブレークポイントでハングさせない限り。
ブレークポイントでハングさせると、新しいHttpApplicationのオブジェクトの作成が開始され、リクエストを処理/処理するためのHttpApplications(1つ以上)の追加が開始されます(現在、で停止しているHttpApplicationによって処理されています。ブレークポイント)。
負荷やエラーの分散と処理を支援するインテリジェントな「舞台裏」の方法である可能性があると思います。しかし、私には手がかりがありません。私はそこにいる人がそれが完全に素晴らしいこととそれがどうあるべきかを私に保証できることを願っていますか?