2011-04-01 14 views
2

を閉じていないとき400インスタンスが呼び出した後、私はあなたがプロキシを閉じるに失敗したときに何が起こるかを調査するために、次のコードを使用しています:WCFクライアントのタイムアウトプロキシ

class Program 
{ 
    static void Main() 
    { 
     for (int i = 1; i < 500; i++) 
     { 
      MakeTheCall(i); 
     } 

     Console.WriteLine("DONE"); 
     Console.ReadKey(); 
    } 

    private static void MakeTheCall(int i) 
    { 
     Console.Write("Call {0} - ", i); 

     var proxy = new ServiceReference1.TestServiceClient(); 

     var result = proxy.LookUpCustomer("123456", new DateTime(1986, 1, 1)); 

     Console.WriteLine(result.Email);    

     //proxy.Close(); 
    } 
} 

サービスバインディングnet.Tcpを使用している、ホストされています、すべてのデフォルト値。

これを実行すると、400を超えるとタイムアウトになります。なぜ400ですか?これは設定です。私はそれがmaxConnectionsよりもずっと少ないと予想しました。

答えて

0

テストコードがタイムアウトする理由は、おそらく既定のWCFサービスの調整によるもので、プロキシオブジェクトを破棄しないこととは関係ありません。クライアント側のリソースを節約するために、常にプロキシインスタンスを適切に処分する必要があります。

サービスホストは、デフォルトでは最大16個のサービスインスタンスしか作成しないと考えています。これは、バインディングがある種のセッションを使用するように設定されている場合はさらに少なくなります。あなたは数秒で約400件のリクエストでそれを氾濫させています。 WCF performance countersのセットがあり、WCFサービスのインスタンスを起動して表示することができます。私はWCF認定試験の準備が本当にいつか役に立つと知っていました:)

+0

ありがとうございます。しかし、クローズプロキシラインのコメントを外すと、500回の繰り返しがすべて正常に完了しますので、サービス調整を行うことは確実ではありません。思考? –

+0

遅れて申し訳ありませんが、私はこの回答を忘れていました。 WCFで確立されるさまざまな種類のセッションのために、サービスの調整が引き続き有効になる可能性があります。すべてのセッションが許容される最大セッションに対してカウントされるアプリケーション(つまりセッションごと)、トランスポート、セキュリティ、および信頼性の高いセッションタイプがあります。クライアントを閉じると、セッション終了プロセスが完了し、サーバー側のリソースが解放される可能性があります。唯一の「セッションレス」バインディングは、認証が設定されていないbasicHttpです。他のバインディングは、ある種のセッションを使用してその機能を実装します。 –

5

プロキシを閉じないと、サービスでセッションが維持されます。 maxConcurrentSessions throttling属性は、サービスが収容できるセッションの数を制御します。デフォルト(.NET 4.0)は100 * Processor Countなので、4つのプロセッサ(またはコア)= 400の同時セッションがあると思いますか?

関連する問題