Периодически дуплексное соединение 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, какой правильный обходной путь?