私は.NET 4で最初のRESTサービスを実装していて、予期せぬものに遭遇しました。私はMicrosoftのServiceModelの基本的な動作を理解していないようですが、伝統的な方法で答えを見つけることはできませんでした。 http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx.NET RESTサービスの実装でのスレッドプールの使用
サービス作品:私はこのチュートリアルの手順に従っていました私のWebサービスを実装するために
。私が驚いたことは、Global.asaxのApplication_BeginRequestとApplication_EndRequestが別のスレッドによって呼び出されたことです。スタックトレースを見ると、これらのスレッドは何らかの種類のスレッドプールに基づいているようです。
いくつかの変数をスレッドローカルストレージに保存していたため、常に同じスレッドで1つのリクエストが常に実行されると仮定していたため、これは問題でした。変数はApplication_BeginRequestで初期化され、Application_EndRequestで解放されます。 ServiceModelでは、これは正しいアプローチではないようです。
私の質問は以下のとおりです。
- は、私はServiceModelを使用していたときにスレッドが私のコードを実行されているかについて何らかの仮定を行うことができますか?
- 実行をシングルスレッドに制限する方法はありますか?これは何らかの理由で悪いことでしょうか?
- ServiceModelを使用しているときに、要求期間中変数を格納する正しい方法は何ですか?
ありがとうございます。
最新の質問に更新します。その1つのスレッドはApplication_BeginRequestを呼び出し、別のスレッドはサービスコードを実行してApplication_EndRequestを実行します。 ServiceBehaviorの変更は何もしませんでした。どんな助けでも大歓迎です。 – Alex
あなたはasp.net互換性のものを使用しているように聞こえます。メッセージディスパッチャ、または他のwcf拡張ポイントとして(asp.netを使用する代わりに)あなたのものを実装しようとしましたか? – sisve
@Simon Svensson私はMicrosoftのチュートリアルhttp://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspxに従っていました。これは、asp.netとの互換性を使用するように見えます。他のアプローチを使用すると、何が違うでしょうか?私が読むことができる良い場所はありますか?ありがとう! – Alex