WCF-уведомление клиента именованного канала / обнаружение изменения состояния канала - PullRequest
3 голосов
/ 02 октября 2009

У меня есть два .NET C # окна формы приложений, которые общаются друг с другом через именованные каналы WCF. Одно из приложений - это служба WCF, а другое - клиент. Связь работает нормально, клиент может вызывать методы обслуживания, а обратные вызовы работают нормально и т. Д. Однако у меня возникает одна проблема: если приложение хоста закрывается, клиент не может обнаружить, что канал больше не доступен. Я попытался зарегистрировать обработчики событий на конвейере для всех событий (Закрытие, Закрытие, Сбой), но они никогда не вызываются, когда приложение хоста закрывается. Кроме того, если я пытаюсь проверить состояние канала в клиенте с помощью свойства pipe.State, я возвращаю состояние Opened, даже если канал неисправен. Тогда, конечно, он выдает исключение, если я пытаюсь вызвать метод службы. Мне либо нужно, чтобы клиентское приложение было уведомлено о том, что служба закрывается, закрывается или неисправна, либо я должен быть в состоянии обнаружить ее перед каждым вызовом метода службы.

У кого-нибудь есть рабочие примеры этого сценария?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2009

Использование WCF над именованными каналами в .NET 3.5 работает для меня. Вот пример

    public ClientUpdaterTray()
    {
        InitializeComponent();
        InstanceContext context = new InstanceContext(new ClientUpdaterServiceCallback());
        client = new ClientUpdaterTrayServiceClient(context);

        client.InnerChannel.Faulted += new EventHandler(InnerChannel_Faulted);
        client.InnerDuplexChannel.Faulted += new EventHandler(InnerDuplexChannel_Faulted);
    }

    void InnerDuplexChannel_Faulted(object sender, EventArgs e)
    {
        // Connection faulted
    }

    void InnerChannel_Faulted(object sender, EventArgs e)
    {
        // Connection faulted
    }
0 голосов
/ 03 октября 2009

Я не думаю, что сервер может сказать клиенту, что он не работает, если клиент фактически не обращается к серверу.

  • Если сервер не работает, он ничего не сделает
  • Если канал закрыт, ему нечего связать по

Лучшее решение, о котором я могу подумать, это то, что вы делаете вызов в рамках функции try catch, а затем обрабатываете ошибку, когда она происходит.

...