2009-06-05 22 views
4

組み込みのVisual Studioテンプレートを使用してWCFアプリケーションを作成し、ループ中に呼び出してみると、5つの要求だけが通過します。サービスが応答を停止します。私がこれを回避できる唯一の方法は、各呼び出しの後に接続を閉じることです。WCFに接続を自動的に閉じるようにするにはどうすればよいですか?

私は、あなた自身の後をきれいにすることを知っていますが、Webサービスでこれを行う必要はないことも知っています。私たちのサービスを打つことになる多くの人々は、彼らの結びつきを終わらせることはありません。

WCFで同じ動作をする方法はありますか?ここで

私の設定

<system.serviceModel> 
    <services> 
     <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior"> 
     <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

コードはどこですか?また、WCFはWebサービスです。あなたは古いASMX技術を指していましたか? _do_はASMXプロキシをクリーンアップする必要があります。そうしないと別の方法で失敗する可能性があります。 –

+0

私は自分自身の後に取り除くべきだと理解しますが、この新しい方法に基づいて、誰かが私たちのサービスと統合し、接続を適切に閉じないと、基本的に私たちのサーバーがダウンする可能性があります。 –

答えて

1

5つの接続はおそらく、サーバーから来ている - あなたは、サーバserviceThrottling行動によって最大オープンセッション数、最大同時通話、および最大サーバーインスタンスを定義することができます。

これと同時に、開かれているセッションの数を増やすことができます。あなたが昔のことをしなくても、自分自身で適切にクリーンアップすることをお勧めします。 。

私はそうのようなusing声明にあなたのクライアントプロキシの使用をラップすることをお勧め:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    // go ahead, call your service methods 
} 

更新: commentorは当然指摘したように、これはSHARのしていますクライアントが処分されると例外がスローされる可能性があるためです。だから、実際にはうまくいかないかもしれません。あるいは、クライアントプロキシを閉じると問題が発生するケースを処理するために、try...catchをラップする必要があります。

Avoiding Problems with the Using Statement


その方法は、クライアントプロキシが自動的に閉じられ、クライアントからサーバへの使用ブロックが終わるの範囲、およびお使いのチャンネルが解放されたときに処分されて参照してください、サーバーの準備ができています別のクライアントから別の通話を受信します。

また、wsHttpContextBindingを使用すると、デフォルトでオンになっているセッションが本当に必要かどうかを確認する必要があります。サーバー上でのコールごとのインスタンス化を使用することをお勧めします。各呼び出し元は新しいサーバーオブジェクトをインスタンス化します。セッションでは、新しい問題や潜在的な落とし穴がたくさんあるので、私は本当に(そしてそれから利益を得る)必要があるときにのみ使用しようと思います。そうでなければセッションをオフにします。マルク・

+3

WCFが壊れて処分できるので、私はusingステートメントにプロキシを置かないでしょう。 try/catch/finally /を使い、最終的にはtry/catchを使ってチャンネルを閉じ、投げた場合は打ち切ります。 –

+0

私は、すべての接続を使用し、私が完了した後に閉じないと、詳細を追加してみましょう。もし私がサーバーに行き、asp.netアプリケーションのperfmonを見れば、私はそこに単一の要求が処理として設定されていて、それ以上の要求が通過できなくなった場合、サーバーにresetiis以外の要求を受け入れる方法が見つかりませんでした。私は、WCFがクライアント側の悪い習慣にあたってサーバーを非常に魅力的にすると信じるのは難しいと思っています。これに基づいて、単一のクライアントがDOSを試すことなくサーバーに接続できるようになります。 –

+0

Kay:これは真実かもしれませんが、接続してセッションを確立し、正しく閉じられていない5つのクライアントがある場合、サーバーを開いた状態で5つのセッションがあり、これがサーバーのスロットリングの既定の制限です。 –

1

WCF Dynamic Client Proxyを見てみましょう。プロキシの後に自動的にクリーンアップされます。

2
  1. 読むこの最初の - > usingステートメントで問題の回避: http://bloggingabout.net/blogs/erwyn/archive/2006/12/09/WCF-Service-Proxy-Helper.aspx(コード) :あなたは上記のリンクによってで提供されるよりも、より堅牢なソリューションが必要な場合http://msdn.microsoft.com/en-us/library/aa355056.aspx

  2. が、私はこれをお勧めしますhttp://bloggingabout.net/blogs/erwyn/archive/2007/01/30/usage-of-the-wcf-serviceproxyhelper.aspx(使用量/サンプル)

Voila!

関連する問題