WSHttpBindingを使用してHTTP経由で通信しているWCFクライアント/サーバーアプリケーションがあります。WCF WSHttpBindingを使用しているときにサーバー上に並行している要求があります。
サーバーの設定:標準WCF ServiceHost
を使用して、自己ホスティング。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false)]
クライアントセットアップ: 私の実際のサービスクラスは次のように起因している(サーバがフルに対応してきたような時間までproxy.call_server_method
ブロック)同期サービス呼び出しを使用して、ビジュアル・スタジオ生成されたクライアントプロキシを使用して
シナリオ: サーバーで実行するのに20秒かかる特定のメソッド呼び出しが1つあります。クライアントはこのメソッドを別のスレッドで呼び出すため、保持されません。ConcurrencyMode.Multiple
は、WCFがサーバー上の別のスレッドでもこのメソッドを実行することを意味します。
この理論は、NetTcpBinding
を使用するようにアプリを設定するとすべて正常に動作するという事実によってサポートされています。
問題:私はWSHttpBinding
を使用するようにアプリケーションを設定した場合
は、この長いメソッド呼び出しは、「バックアップ」にhttp要求が発生します。私は、ログを検査したり、HTTPリクエストをfiddlerでデバッグしたりすることで、この動作を確認しました。
例:
- クライアントは、クライアントがdoesnのサーバに送信されますフォアグラウンドスレッド
- リクエストB及びC上の要求B及びCを開始
- バックグラウンドスレッドで20秒の長い要求を開始 :それは20秒の長い要求
しかし、時にはで行われるまで、「トンは、それらを処理します3210
- リクエストBとC は、20秒間のリクエストが戻ってくるまで(これはまれです)、(フィドラーには表示されません)というメッセージは送信されません。
- 注:クライアントのapp.configに
<add address="*" maxconnection="100"/>
を設定すると、これが(表示された)状態で終了します。
- 注:クライアントのapp.configに
- リクエストBが送信され、リクエストC(これは稀である)
ここで問題を示すフィドラーからタイムラインの一つが完了20秒までバック保持しながら、直ちに応答を受信します:(あなたが見ることができるように、要求は、すべてのサーバでバックアップ取得され
)より大きなバージョンのためにクリックしてください。 20秒間のリクエストが完了すると、応答はすべて氾濫してきますが、でないリクエストがあることに注意してください。 ...だから、
、質問:
- 一体ここで何が起こっていますか?
NetTcpBinding
を使用しても問題なく動作し、WSHttpBinding
を使用して動作しないのはなぜですか? - なぜ矛盾した動作ですか?
- 私はそれを修正するために何ができますか?
注:これは、サーバー上のロックではないです
- 。私はブレークポイントを設定し、
!syncblk
を使用しており、ロックは保持されていないと一貫して報告します。 - それは私が、サーバーのapp.configをで
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
セット - 20秒のコールがちょうどタイマーで待っている、それはCPUやディスクをスラッシングていない持っている私のスレッド(NetTcpBindingがそうでなければ動作しないはずです)
- ではありませんまたはネットワーク
- 私は非同期呼び出しを使用するためにアプリケーションを再構築することを含まないソリューションを好むだろう...それはレガシーコードの大きな束であり、私は実際には、理解する。
+1質問の優れたレイアウト。 –
この問題を解決しましたか?もしそうなら、それをどうやって解決しましたか? – DivisionByZorro
それは多少の挙動を変更しましたが、今すべての要求は、タイムライングラフからして私の質問を更新しましたサーバー –