Уведомление клиента именованного канала WCF / обнаружение изменения состояния канала

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

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


person Community    schedule 01.10.2009    source источник


Ответы (2)


У меня работает 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
    }
person coreywride    schedule 07.12.2009

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

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

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

person Shiraz Bhaiji    schedule 03.10.2009