3

IIS 7 でホストされている WCF サービスを使用していますが、これは一定期間正常に実行され、その後、他のネットワークの場所との通信に失敗します (外の世界に接続できる TCP ポートがないと思われます)。

申請の背景:

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

セントラル 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
    }
}

壊れたらどうなりますか:

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

いくつかの興味深い点:

障害状態では、サーバーへの接続は確立できますが、サーバーからの接続は確立できません。

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

セントラル WCF サービスは IIS 7 でホストされ、アプリケーション プールのリサイクルは無効になっています

残念ながら、名前付きパイプはオプションではありません (クライアントとサーバーは別のマシン上にあります)。

私の考え/質問

すべての兆候は、サーバーの TCP ソケットが不足していることを示しています。WCF をClientProcessorClient適切に設定していますか? それらを適切に処分していますか?usingそれらをステートメントでラップする必要がありますか? 問題が発生した場所をデバッグ/診断する方法を知っている人はいますか?

ありがとう

4

1 に答える 1

1

良くも悪くも、Microsoft は WCF サービス プロキシ ロジック (ClientBase または ChannelFactory から直接) を実装して、Close() メソッドで例外をスローできるようにすることを決定しました。Dispose() メソッドは Close() を呼び出すだけだと思いますが、ソース コードを見ようとしたことはありません。プロキシが障害状態の場合、Abort() を呼び出してリソース (TCP セッションなど) を解放する必要があります。

つまり、Close() または Abort() の呼び出しが正常に完了するまで、WCF サービス プロキシはリソースを解放しません。プロキシ インスタンスを適切に閉じるための 1 つのオプションについては、このブログ投稿をご覧ください。

于 2012-04-12T13:00:19.487 に答える