2014-01-27 2 views
0

В настройке публикации/подписки WCF в настоящее время у меня есть метод Unsubscribe(), чтобы изящно отключить клиентов с хоста WCF, когда клиент закрыт или ему необходимо прекратить прослушивание; однако это не относится к случаям, когда клиент прерывается принудительно или ненормально, например, сам компьютер теряет силу. Если клиентское приложение умирает таким образом, то его канал остается и следующее сообщение об ошибке получила на издателе следующий раз, когда он пытается разослать сообщения:WCF CommunicationException Когда подписываемые клиенты прерываются ненормально

ExceptionDetail> was caught 
The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted. 

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

public static void Publish(DateTime sendTimeStamp, DataTable sendTable) 
     { 
      InstanceContext context = new InstanceContext(null, new PublishStatus()); 
      MessagesClient publishingClient = new MessagesClient(context); 
      try { 
       publishingClient.PublishMessage(sendTimeStamp, sendTable); 

       if (publishingClient.State != CommunicationState.Faulted) 
        publishingClient.Close(); 
       else 
        publishingClient.Abort(); 
      } 
      catch (CommunicationException ex) 
      { 
       // This is where the error is caught 
      } 
      catch (TimeoutException ex) 
      { 

       publishingClient.Abort(); 
      } 
      catch (Exception ex) 
      { 
       publishingClient.Abort(); 
       throw ex; 
      } 
     } 

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

+0

Я не могу получить его, как я вижу, что вы говорите о сервере, но код при условии очень похож код клиента , Или я что-то неправильно понимаю? – Tony

+0

Код был из издателя (службы Windows), который периодически отправляет сообщения клиентам, которые подписываются и выслушивают их. Вы правы в том, что многие из этих кодов исключений, как правило, были на стороне клиента, но если он собирался передать сообщения назад. Удалось найти решение, но спасибо за ваше время. знак равно – user2912928

ответ

0

После некоторых проб и ошибок, а также исследований исключений, дополнительный блок try-catch на моем хосте WCF смог отменить подписку неправильно прерванных клиентов и не допустить возврата ошибки в службу публикации. Проводка простой вариант здесь, в случае, если кто-либо еще натыкается на тот же тип задачи:

public static event MessageEventHandler MessageEvent; 
     public delegate void MessageEventHandler(object sender, ServiceEventArgs e); 

     IClientContract callback = null; 
     MessageEventHandler messageHandler = null; 

     public void Subscribe() 
     { 
      callback = OperationContext.Current.GetCallbackChannel<IClientContract>(); 
      messageHandler = new MessageEventHandler(Publish_NewMessageEvent); 
      MessageEvent += messageHandler; 
     } 

     public void Unsubscribe() 
     { 
      MessageEvent -= messageHandler; 
     } 

     public void PublishMessage(DateTime timeStamp, DataTable table) 
     { 
      ServiceEventArgs se = new ServiceEventArgs(); 
      se.timeStamp = timeStamp; 
      se.table = table; 
      MessageEvent(this, se); 
     } 

     public void Publish_NewMessageEvent(object sender, ServiceEventArgs e) 
     { 
      try 
      { 
       // This callback was causing the error, as the client would no longer exist but the channel would still be open and trying to receive the message 
       callback.ReceiveMessage(e.timeStamp, e.table); 
      } 
      catch 
      { 
       // Unsubscribe the dead client. 
       Unsubscribe(); 
      } 
     } 
Смежные вопросы