MVC がリクエストを処理する方法を誰かに説明してもらえますか? 私は MVC Web アプリケーションを持っていますが、どの AppDomain が各要求を実行するかを確認しようとするまで、いくつかの問題がありました。あるAppDomainにコントローラーを作成することもあれば、別のAppDomainにコントローラーを作成することもあるという奇妙なことが(私にとって)起こっています。コントローラーのコンストラクターに AppDomain.CurrentDomain.GetHashCode() を追加しましたが、リクエストごとに値が異なります (ただし、リクエストごとではなく、値が既に使用されている場合もあります)。 AppDomain.
デバッグには Visual Studio 2010 開発 Web サーバーを使用します。
ここにコールスタックがあります:
Appdomain Transition があり、異なる AppDomains で実行されているコードがあるという事実は、間違いなく異なる AppDomains を作成しますが、どうすればこれを制御できますか? 私はこのことについてあまり経験していないので、誰かがそれを変更する方法を教えてもらえますか? 1 つの AppDomain でコードを実行する必要があります。
ありがとうございました。
更新 1: 少し混乱する可能性があります。私のコードは MVC のさまざまな AppDomain で実行されることを意味していましたが、WebServer は AppDomain を作成し、MVC への呼び出しをラップします。それで、なぜこれが起こっているのですか?誰でも説明できますか?
更新 2: リクエストごとに AppDomain を作成する理由を見つけて発行しました。「PEngine」というC++ライブラリのDllImportを通じて、アンマネージメソッド「Process」を内部的に利用するC# dll「PEngineCSharp」を管理しています。
私のコントローラーにはいくつかのメソッドがあり、そのうちの 1 つ「PEngineProcess」では、メソッドは次のように呼び出されます。
PEngineCSharp.PEngine.Process(ProcessInfo info);
コントローラーの「PEngineProcess」メソッドへの各呼び出しの後、各要求は個別の AppDomain で開始されます。このメソッドを呼び出さずに、純粋に管理された他のメソッドを呼び出すと、それらはすべて 1 つの AppDomain で実行されます。「PEngineCSharp.PEngine.Process(ProcessInfo info);」という呼び出しにコメントした後、コントローラーのメソッド「PEngineProcess」を呼び出しても、新しい AppDomain は作成されず、すべてが 1 つの AppDomain で実行されます。テストのために、「PEngineCSharp.PEngine.Process(ProcessInfo info);」を追加しました。別のコントローラーのメソッドに送信し、その後、新しい AppDomains でリクエストが再び開始されました。そのため、そのような動作の原因を見つけました。また、VisualStudio WebServer、IIS Express 7.5、および IIS 7.0 ですべてを試しました。そのような動作はすべて同じです。
そこで何が起こっているのか誰か説明してくれませんか?ありがとうございました!