2012-04-12 12 views
3

IIS 7でホストされたWCFサービスを一定期間実行すると、他のネットワークロケーションとの通信に失敗する(TCP外の世界に接続可能なポート)アプリケーションのIISホストWCFサービスがTCPポートをリサイクルしない "不十分なWinsockリソース"

背景:

私のシステムは、時間がかかり、大きなメディアファイルを()トランスコードします。私は中央でホストされているWCFサービスを持っています。このサービスはサーバーAにあります。これは「中央WCFサービス」と呼ばれます。次に、B、C、D、E、Fなど、さまざまなサーバー上のメディアファイルを実際にトランスコードするクライアントサービスを多数用意しています。これらを「クライアントプロセッササービス」と呼びます。セントラルWCFサービスは、「トランスコードジョブ」が処理されるために送られるクライアントプロセッササービスを管理します。これらのクライアントプロセッササービスは、それぞれホストされたWCFサービスであり、基本的に長時間実行されるプロセスを実行し、セントラルWCFサービスのジョブ進行率を確認することによってポーリングされます。したがって、Central WCFサービスは、これらのクライアントにジョブの進行状況をポーリングするために多くの接続を開きます。ポーリングは、各クライアントにおよそ2〜3秒ごとに1回発生します。

セントラルWCFサービスには、クライアントプロセッササービスのアドレスの文字列リストが格納されます。各クライアントをポーリングするために使用されるコードは、(ストリップダウンバージョン)の下descrbiedさ:

私は中央WCFサービスとそれに多くのトランスコードジョブを送信することができます:それは壊れたときに何が起こる

public ClientProcessorClient getClientByaddress(string address) 
{ 
    Binding bidning = new NetTcpBinding(SecurityMode.None); 
    return new ClientProcessorClient(bidning, new EndpointAddress(address)); 
} 

public void pollJobs() 
{ 
    foreach (string clientAddress in clients) 
    { 
     ClientProcessorClient client = getClientByaddress(clientAddress); 
     int progress = client.GetProgress(); 
     client.Close(); 
     // Do stuff with progress 
    } 
} 

クライアントにジョブをサブミットして進行状況を更新します。処理の約1時間後に、セントラルWCFサービスがホストされているサーバーが正常に動作しなくなります。クライアントWCFサービスに連絡しようとすると、エラーが中央WCFサービスInsufficient winsock resources available to complete socket connection initiation.によってスローされます。クライアントWCFサービスは、ローカルマシン上で実行されているWCFテストクライアントからすべてping可能です。また、この状態でサーバーがネットワークファイルリソースを表示できないことに気付きました - 私は遠隔地にログインし、ネットワークに接続されたストレージフォルダを探しましたが、接続に失敗しました。しかし私はそのサーバに電話をかけることができます。私はWCFテストクライアントを開き、中央WCFサービスに接続し、それをpingメソッドと呼ぶことができます。通信はINから可能ですが、OUTからはできません。

興味のあるいくつかのポイント:

サーバーへの接続を行うことができ、故障した状態ではなく、サーバーから。

私の各サービス(中央WCFサービスとクライアントプロセッササービス)は、シングルトンインスタンスです。

中央WCFサービスは、IIS 7でホストされており、アプリケーションプールのリサイクルが

残念ながら、名前付きパイプはオプション(クライアントとサーバが異なるマシン上にある)

私の考え/ご質問ではありません無効になっています

すべての記号は、TCPソケットが不足しているサーバーを指しています。 WCF ClientProcessorClientが正しく設定されていますか?私はそれらを適切に処分していますか? using声明でそれらを囲む必要がありますか?問題が発生した場所をデバッグ/診断する方法を知っている人はいますか?

おかげで良いか悪いのために

答えて

1

、Microsoftは例外が閉じる()メソッドでスローすることができるように、WCFサービスのプロキシ・ロジック(ClientBaseまたは直接のChannelFactoryからのいずれか)を実施することを決定しました。私はすべてのDispose()メソッドがClose()を呼び出すとは信じていますが、私はソースコードを見てみることは一度もありません。プロキシが障害状態にある場合は、リソース(TCPセッションなど)を解放するためにAbort()を呼び出す必要があります。

WCFサービスプロキシは、Close()またはAbort()の呼び出しが正常に完了するまでリソースを解放しません。このblog postを見て、1つのオプションでプロキシインスタンスを正しく閉じることができます。

+0

私は 'Close()'が実際に毎回成功していると確信していますが、すぐにテストしますので、あなたが今言ったことに基づいて開いたままのソケットはありません。 – user989056

関連する問題