Узел Azure WCF вызывает ошибки связи при перезапуске одного экземпляра - PullRequest
0 голосов
/ 14 октября 2010

У меня довольно специфическая проблема с хостом 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.откройте соединение с экземпляром, которого больше нет, несмотря на то, что все, что я прочитал, говорит, что этого не должно быть.

Могу ли я что-нибудь сделать, чтобы избежать этой проблемы, кроме как просто поймать это?конкретная ошибка и повтор?Существуют ли шаблоны для повторения клиентских вызовов?Если я попытаюсь повторить, как я могу убедиться, что эта хитрая связь действительно была устранена?Мои попытки повторных попыток пока не увенчались успехом.

1 Ответ

0 голосов
/ 22 октября 2010

После долгих исследований проблема, похоже, связана не с клиентом, а с сервером.Рабочая роль запускала хост WCF в OnRun.Проблема заключается в том, что к тому времени, когда рабочая роль попадает в событие OnRun, она уже дала сигнал балансировщику нагрузки, что она готова к приему сетевого трафика.Видя, что хост еще не запущен, он не был готов.

Решение было перенести код, который запускает хост WCF, в метод OnStart.некоторый довольно хороший код повтора клиента WCF.Это сейчас нам, кажется, не нужно.

...