Как сделать так, чтобы сервис WCF с помощью nettcpbinding переподключался автоматически? - PullRequest
1 голос
/ 20 марта 2009

У меня есть асинхронная служба WCF, использующая nettcpbinding. И я отправляю ему кучу запросов и получаю результат, вызывая EndDoWork () в моем обратном вызове. Если EndDonWork генерирует исключение один раз, все вызовы после этого будут вызывать исключение: объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоваться для связи, поскольку он находится в состоянии Failed.

Я думаю, что это что-то близкое из-за первого исключения. Мой вопрос: 1. что решает это поведение? Если я использую basicHttpBinding, последующий вызов EndDoWork будет работать хорошо. Это связано с поддержкой keepAlive? 2. Есть ли какое-либо свойство элемента конфигурации, которое я могу задать для автоматического восстановления службы?

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Неисправное состояние канала означает, что на него нельзя больше полагаться. Вы не упомянули причину, по которой было сгенерировано исключение (подключение, сервер остановлен и т. Д.), Но что касается WCF, конечная точка недопустима и, следовательно, неисправна.

Вам необходимо заново создать канал и снова подключиться к услуге, чтобы продолжить любые ваши операции. Если вы используете такие функции, как Надежные соединения, то часть работы может быть выполнена за вас, но если канал в конечном итоге выйдет из строя, применяются те же правила.

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

1 голос
/ 10 июня 2009

Где находится класс MyDefinedFault. как определить этот класс.

1 голос
/ 18 апреля 2009

Если я правильно помню, вы можете избежать сбоя канала, если заявите о неисправности в договоре на эксплуатацию.

Например:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [FaultContract(typeof(MyDefinedFault))]
    void Operation();
}

Поскольку вы уже объявили MyDefinedFault в операционном контракте, если вы выбросили это из службы, канал не выйдет из строя (если, конечно, вы не используете System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults = true, который может вызвать ошибку канал в любом случае).

...