0

Azure の WCF ホストに関してかなり具体的な問題があります。状況を説明しますので、ご容赦ください。

Net TCP バインディングを使用して、Azure ワーカー ロールでホストされている WCF ホストがあります。冗長性を提供するために、この worker ロールの 2 つのインスタンスを実行しています。私たちの問題とは関係のない理由で、構成設定を 1 時間ごとに変更して、これらのインスタンスを強制的に再起動します。アップグレード ドメインのおかげで、1 つのインスタンスが 2 番目のインスタンスの前に再起動されます。つまり、常に少なくとも 1 つのインスタンスが実行されています。

私たちのクライアント コード (これも Azure で実行されていますが、どこにあったかは問題ではないと思います) は次のように見えます (要点を誇張するために関数名が変更されています)。

public BrowseResults Browse(BrowseParameters parameters)
{
    using (Proxy client = CreateProxyWithBindingsAndEndPoints())
    {
        return client.Browse(parameters);
    }
}

private Proxy CreateProxyWithBindingsAndEndPoints()
{
    var binding = new NetTcpBinding(SecurityMode.Transport);

    binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
    binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;

    var epAddress = new EndpointAddress(
        new Uri("http://myapp.cloudapp.net:1000/myservice"),
        new DnsEndpointIdentity("my identity"),
        new AddressHeaderCollection());

    var client = new Proxy(binding, epAddress);

    client.ClientCredentials.ClientCertificate.Certificate = GetClientCertificate();

    return client;
}

これから私が期待するのは、この Browse 関数を呼び出すたびに、新しいチャネルと新しい接続を持つ新しいプロキシを作成していることです。

私たちの問題は、インスタンスの 1 つが再起動されたときに発生し、System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted stateエラーが発生します。これで、再起動するホストごとにこれらのエラーの 1 つだけが発生しますが、これは依然としてエラーなしでは解決できません。

私の現在の作業仮説は、私が読んだすべてがそうであってはならないと言っているという事実にもかかわらず、WCFクライアントがもはやそこにないインスタンスへの接続を開いたままにしているということです。

この特定のエラーをキャッチして再試行する以外に、この問題を回避するためにできることはありますか? クライアント呼び出しを再試行するためのパターンはありますか? 再試行した場合、この危険な接続が本当に解消されたことを確認するにはどうすればよいですか? これまでの再試行の試みはあまり成功していません。

4

1 に答える 1

0

かなりの調査の後、問題はクライアントではなくサーバーにあるようです。Worker ロールは、OnRun で WCF ホストを開始していました。問題は、ワーカー ロールが OnRun イベントに到達するまでに、ネットワーク トラフィックを受信する準備ができていることをロード バランサーに通知していることです。ホストがまだ実際に起動していないので、準備ができていませんでした。

解決策は、WCF ホストを開始するコードを OnStart メソッドに移動することでした。

また、非常に優れた WCF クライアントの再試行コードもいくつか作成しました。今は必要ないようです。

于 2010-10-22T03:47:34.150 に答える