2010-05-21 1 views
2

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

Например, если служба была перезапущена, идентификатор сеанса клиента недействителен, поскольку этот сеанс был закрыт на стороне сервера.

Я проверяю состояние канала перед вызовом контракта, и его значение является CommunicationState.Открыто, даже если сеанс уже нарушен. Поэтому, когда я вызываю контракт после этой проверки, я получаю сообщение CommunicationException с этим сообщением:

Удаленная конечная точка больше не распознает эту последовательность. Это, скорее всего, связано с прерыванием на удаленной конечной точке. Значение wsrm: Идентификатор не является известным идентификатором последовательности. Надежный сеанс был сбит.

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

P.S. Тип CommunicationException является общим, поэтому я не могу обнаружить сбой сеанса, поймав это исключение.

P.P.S. Я задал аналогичный вопрос here, но в этом случае я не знал причины, теперь я не знаю, как уклониться от него.

ответ

3

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

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

Update: да, CommunicationException только общий базовый класс для всех исключений, связанных с WCF - проверить MSDN docs, чтобы увидеть обо всех исключений нижестоящих вы можете поймать, чтобы быть более точным - EndpointNotFoundException, FaultException (или FaultException<T>), ProtocolException и многие другие!

+0

Да, кажется, единственный способ поймать исключение, но тип CommunicationException слишком общий. –

 Смежные вопросы

  • Нет связанных вопросов^_^