2009-05-07 8 views
26

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"/>を設定すると、これが(表示された)状態で終了します。
  • リクエストBが送信され、リクエストC(これは稀である)

ここで問題を示すフィドラーからタイムラインの一つが完了20秒までバック保持しながら、直ちに応答を受信します:(あなたが見ることができるように、要求は、すべてのサーバでバックアップ取得され

)より大きなバージョンのためにクリックしてください。 20秒間のリクエストが完了すると、応答はすべて氾濫してきますが、でないリクエストがあることに注意してください。 ...だから、

質問

  • 一体ここで何が起こっていますか? NetTcpBindingを使用しても問題なく動作し、WSHttpBindingを使用して動作しないのはなぜですか?
  • なぜ矛盾した動作ですか?
  • 私はそれを修正するために何ができますか?

注:これは、サーバー上のロックではないです

  • 。私はブレークポイントを設定し、!syncblkを使用しており、ロックは保持されていないと一貫して報告します。
  • それは私が、サーバーのapp.configをで<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />セット
  • 20秒のコールがちょうどタイマーで待っている、それはCPUやディスクをスラッシングていない持っている私のスレッド(NetTcpBindingがそうでなければ動作しないはずです)
  • ではありませんまたはネットワーク
  • 私は非同期呼び出しを使用するためにアプリケーションを再構築することを含まないソリューションを好むだろう...それはレガシーコードの大きな束であり、私は実際には、理解する。
+0

+1質問の優れたレイアウト。 –

+1

この問題を解決しましたか?もしそうなら、それをどうやって解決しましたか? – DivisionByZorro

+0

それは多少の挙動を変更しましたが、今すべての要求は、タイムライングラフからして私の質問を更新しましたサーバー –

答えて

2

私はこの問題を解決するために管理したことがない、最後に

[セルフ答えは、私たちの最終的な解決策が何であったか、他のユーザーを表示します]。
私たちの最終的な解決策は、アプリケーションをWSHttpBindingから生産中のNetTcpBindingに切り替えることでした。私たちはパフォーマンス上の理由からこれを最終的にやる予定でした。

WSHttpBindingには黒いマークが付いているので、これはむしろ残念ですが、これは保証されているかもしれません。誰もがWSHttpBindingのディッチを含まないソリューションを考え出すなら、それについて知りたいです

+1

に設定されています私たちは答えがありません。 connect.microsoft.comにバグを投稿しようとしましたか? – Shrike

+0

どのように動作するかについてもう少し分かったので、ThreadPoolのオーバーロードに関連していた可能性があります。あなたがスレッドプールに長時間実行操作の多くをキューに入れる場合は、この –

+0

ように私は、WSHttpBindingとまったく同じ問題を抱えているほぼ正確に見える行動を取得し、私はそれが過負荷にスレッドプールが原因ではないと思います。 NetTcpBindingを使用していて、突然完全に動作します。別のサーバーから別の通話を並行して表示しようとしている間に、サービスへの最初の呼び出しをスリープ状態にするだけで、説明した内容を得ることができます。サービスの動作とサービスの制限が設定されているかどうかにかかわらず、他の人がサービスに連絡することはできません。 – Mike737

10

WCF以外のスロットル(.NetまたはWindowsのもの)は、デフォルトで最大2つの同時の送信HTTP接続のみを許可します。残念ながら、私の人生のために、物の名前(そして、あなたがapp.configやあなたのアプリをそれを上書きするために置くもの)を覚えていません。要求がクライアントを離れているのを見ていないとすれば、それはHTTPだけだから、あなたは「そのこと」を打っていると思います。名前を探し続けるよ。

更新:それは発見 - クライアントでこれを試してください(ただし、大きな数に「2」に変更):

<configuration> 
    <system.net> 
    <connectionManagement> 
     <add address = "*" maxconnection = "2" /> 
    </connectionManagement> 
    </system.net> 
</configuration> 
+0

は、残念ながら、これはそれを解決しませんでしたを記述し、自己の答えを追加しましたうまくいけば –

+0

でバックアップしているようだ...私たちの最後の「ソリューション」 –

0

私は忘れて - それは、発注されるだろうか?私は多分httpのRMはオーダーを維持するかもしれないと思うかもしれないが多分Tcpセッションは(あなたが明示的に要求しない限り)?順序付けられた/順序付けられていないセッション(私が忘れている)を記述したサービス契約の属性がありますか?

+0

注文した属性を持つがあります助けるべきシオマネキは...私はそれは私はあなたが実際には、自己の答えではないはずだと思う –

1

BasicHttpBindingに変更すると動作しますか?

だから、それはthis is your problemのように聞こえますが、セッションのスロットル、私はお尻に私をビット。

1

の同時呼び出しを許可するには、コール単位のサービスでConcurrencyMode.Multipleを使用することを検討してください。

4

私たちは、IIS/ASP.NETでホストされているJSONサービスとまったく同じ症状を見ました。

根本的な原因は、要求を同期ASP.NETことになった - ないWCF。 WCFの同時メソッドを取得するには、セッション状態(アプリケーションレベル)を無効にする必要がありました。

のWeb.configは: <system.web> <sessionState mode="Off" /> </system.web>

当社のサービスはwebHttpBinding、wsHttpBindingない使用していますのでご注意ください。だから、これもオリオンの問題を解決するかどうかは分かりません。

2

私は、あなたがクライアントマシンに標準設定を変更する必要がありますが、プロトコルの制限をヒットだと思うし、それを回避するために:

http://support.microsoft.com/kb/183110

http://support.microsoft.com/kb/282402

私が発行するときWSHttpBindingはWININETの設定を使用して推測します要求。

+0

これはおそらくそうですが、私は元のコードを失って以来長いです。しかし、ありがとう! –

0

わからないが、時々、Silverlightアプリケーションからの同時呼び出しでの問題は、ブラウザの接続管理と関連しています。私のためのソリューションは、ここでdescriveとして私達のApp.xaml.cs、Application_Startup方法でそれを置くことだった:http://weblogs.asp.net/olakarlsson/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 
関連する問題