У меня довольно специфическая проблема с хостом WCF в Azure.Пожалуйста, потерпите меня, пока я описываю ситуацию.
У нас есть хост WCF и рабочая роль Azure, использующая привязку TCP по сети.У нас есть два экземпляра этой рабочей роли, выполняющей резервирование.По причинам, которые не имеют отношения к нашей проблеме, мы принудительно перезапускаем эти экземпляры, меняя параметры конфигурации каждый час.Благодаря доменам обновления один экземпляр перезапускается перед вторым, что означает, что у нас всегда работает хотя бы один экземпляр.
Наш клиентский код (также работает на 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;
}
Я ожидаю от этого, что мы создаем новый прокси с новым каналом и новым соединением каждый раз, когда мы вызываемэта функция обзора.
Наша проблема возникает, когда один из экземпляров перезапускается, мы получаем System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state
ошибок.Теперь мы получаем только одну из этих ошибок для каждого перезапускаемого хоста, но без этой ошибки мы не обойдемся.
Моя текущая рабочая гипотеза состоит в том, что где-то под капотом удерживается клиент WCF.откройте соединение с экземпляром, которого больше нет, несмотря на то, что все, что я прочитал, говорит, что этого не должно быть.
Могу ли я что-нибудь сделать, чтобы избежать этой проблемы, кроме как просто поймать это?конкретная ошибка и повтор?Существуют ли шаблоны для повторения клиентских вызовов?Если я попытаюсь повторить, как я могу убедиться, что эта хитрая связь действительно была устранена?Мои попытки повторных попыток пока не увенчались успехом.