В настройке публикации/подписки 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;
}
}
Можно ли изолировать неисправный канал от этой точки (в которой исключением первого подхватывает по этому вопросу) и распоряжаться ею так, что сама издательская служба может продолжать отправлять сообщения?
Я не могу получить его, как я вижу, что вы говорите о сервере, но код при условии очень похож код клиента , Или я что-то неправильно понимаю? – Tony
Код был из издателя (службы Windows), который периодически отправляет сообщения клиентам, которые подписываются и выслушивают их. Вы правы в том, что многие из этих кодов исключений, как правило, были на стороне клиента, но если он собирался передать сообщения назад. Удалось найти решение, но спасибо за ваше время. знак равно – user2912928