私はHTTPモジュールを作成していましたが、デバッグ中は最初は(少なくとも)奇妙な動作のように思えるものに気付きました。HttpModule Initメソッドが何度か呼び出されます - なぜですか?
httpmoduleのinitメソッドにブレークポイントを設定すると、デバッグのためにウェブサイトを起動しただけで、httpモジュールのinitメソッドが複数回呼び出されていることがわかります。 1回のみ、他の回数は10回)。
私は、HttpApplicationのいくつかのインスタンスが実行され、各HTTPモジュールが作成されることを期待する必要があることを知っていますが、単一のページを要求すると、単一のHTTPアプリケーションオブジェクトによって処理されるため、イベントは一度関連していますが、各リクエストに対して何回もイベントを発生させますが、それは意味がありません - それは、httpApplication内で何度も追加されている必要があります - つまり、毎回呼び出されるのと同じhttpmodule initメソッド新しいhttpアプリケーションがブレークポイントに当たるたびに作成されます(下のコード例を参照してください)。
ここで間違っていますか?私はデバッグしているし、httpモジュールでブレークポイントを設定しているのでですか?
私はデバッグのためにWebサイトを起動し、httpmoduleのブレークポイントをすばやくステップするとinitメソッドを1回だけ実行し、イベントハンドラも同じように見えることに気付きました。私が代わりにブレークポイントで数秒間ハングさせた場合、initメソッドは何度か呼び出されています(ブレークポイントを踏むまでにどれくらい時間がかかっているかによって異なります)。たぶんこれは、httpmoduleが初期化され、httpアプリケーションが要求を処理できることを確認する機能をいくつか組み込んでいるかもしれませんが、壊滅的な結果を招く可能性のあるもののようです。
これは論理的に思えるかもしれません。要求を完了しようとしている可能性があり、何か問題が起こったと思ってブレークポイントを設定したため、initメソッドを再度呼び出そうとしていますか?それは要求を処理することができますか?
これは何が起きているのか、それはすべてうまく(私はちょうど推測していますか)、それとも本当の問題ですか?
私が特に気にしているのは、何かが「プロダクション/ライブ」サーバーに数秒間ハングアップすると、initを介して多くのイベントハンドラが追加され、ページへの各リクエストが突然イベントハンドラを起動する数回。
この現象により、すぐにサイトがダウンする可能性があります。
私はformauthenticationとrolemanagermoduleなどのhttpmodulesに使用されている "元の" .netコードを見てきましたが、私のコードはこれらのモジュールが使用するものとはまったく異なります。
私のコードは次のようになっています。ここ
public void Init(HttpApplication app)
{
if (CommunityAuthenticationIntegration.IsEnabled)
{
FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];
formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
}
}
は何が起こっているか、誰を知っていますそれは、.NETフレームワーク
public void Init(HttpApplication app)
{
if (Roles.Enabled)
{
app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
app.EndRequest += new EventHandler(this.OnLeave);
}
}
からRoleManagerModuleで行われている方法の例ですか?
(私はそこに誰かがすべてが完全に罰金であることを私になぜこれが起こっている私に言うと保証することができることを望む:))
UPDATEが01:
私が試してみましたが、問題を絞り込みますこれまで私は、呼び出されているInitメソッドが常に私のHTTPモジュールの新しいオブジェクトにあることを発見しました。
最初のリクエスト(サイトの起動時)は、作成されているHttpApplicationオブジェクトとそのモジュールのすべてが最初のリクエストを処理しようとしているため、追加されているイベントハンドラがすべてヒットしているようです。 なぜこれが起こっているのかわかりません。
私は別のページを要求した場合、すべての作成のHttpApplicationの(およびそのmoduless)は、再び、それはイベントハンドラを複数回ヒットさせる要求にサービスを提供しようとします。
しかし、私は最初のページ(または別のもの)にジャンプすれば、1つのHttpApplicationだけが要求を処理し始め、すべてが期待どおりであると思われます。ブレークポイント。
私がHttpApplicationのオブジェクトを作成し、HttpApplicationのオブジェクトを作成し始め、要求を処理したり処理したりするためにHttpApplications(1以上)を追加し始めます(現在停止しているHttpApplicationによって処理中です)ブレークポイントで)。
私は推測するか、負荷および/またはエラーを配布し、処理するために助けることのいくつかのインテリジェントな「舞台裏」の方法であるかもしれないことを願っています。しかし、私は手がかりがありません。 私はそれが完全にうまく、どのようになっていると私に保証することができるいくつかの希望がありますか?
私のHttpModuleでもこの動作が見られます –
ジョン:これを閉じるのを忘れました。ブラウザーが任意のリソース(イメージ、javascript、スタイルシート)を要求するたびにモジュールがヒットするため、少なくとも私の場合はこれが起こります。ヒットする理由は、MVCなどで使われているルーティングモジュールです。すべての要求はルーティングモジュールによって処理される必要があり、そのためすべての要求がモジュールを不幸にしてしまいます。私はこれについて質問しましたが、誰もそれに答えませんでした。 – MartinF