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