Закрытие и повторное открытие неисправного прокси-сервера DuplexClientBase WCF в Silverlight - PullRequest
2 голосов
/ 17 декабря 2010

Периодически дуплексное соединение Net.TCP между нашим приложением Silverlight и нашим веб-сервисом WCF будет переходить в состояние сбоя - например, из-за временных проблем в сети или в случае сбоя и перезапуска службы, и тому подобное. Когда это произойдет, я хотел бы поймать это и заново открыть соединение. Звучит просто, правда? Вы должны быть в состоянии сделать что-то вроде этого:

private void Channel_Faulted(object sender, EventArgs e)
{
    client.CloseCompleted += (sender, e) =>
        {
            if (e.Error == null)
                client = CreateClient();
            else
                Debug.WriteLine(e.Error.ToString());
        };
    client.CloseAsync();
}

Но когда я пытаюсь, чтобы ошибка e.Error в обработчике CloseCompleted имела следующее исключение:

Объект связи, System.ServiceModel.Channels.ServiceChannel, нельзя использовать для связи, поскольку он находится в состоянии Failed.

Я пробовал целую кучу вариаций на эту же тему, в том числе:

  • Не закрывать соединение после сбоя и просто воссоздать его.
  • Вызов client.InnerChannel.Close () и / или client.ChannelFactory.Close () вручную.
  • вызов client.InnerChannel.Dispose () и / или client.ChannelFactory.Dispose () вручную.
  • Множество других вещей, которые я сейчас забыл.

Эти стратегии привели к множеству ошибок, но ни одна из них не сработала правильно, включая такие решения, не относящиеся к Silverlight, которые упоминаются, скажем, здесь или здесь (но все для обычных приложений CLR, не Silverlight). Конечно, это довольно просто сделать, но, очевидно, кеширование каналов мешает мне. Что мне не хватает? Какой правильный способ сделать это в Silverlight? Если это ошибка в Silverlight, какой правильный обходной путь?

1 Ответ

1 голос
/ 17 декабря 2010

Как и с большинством вещей, которые, кажется, работают необъяснимым образом, проблема была в моей вине. Фактический код, с которым я работаю, (не удивительно, я надеюсь) значительно сложнее, чем упрощенная версия, которую я выложил выше. И оказывается, что в моем реальном коде, в конкретном пути кода, который я тестировал, эквивалент этой строки никогда не вызывался:

client = CreateClient();

Другими словами, клиент фактически не воссоздавался после сброса ошибки, и ошибки, с которыми я сталкивался, в основном были вызваны попыткой повторно использовать старый экземпляр. Извините за суету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...