WCF - обработка ошибок при потоковой передаче - PullRequest
1 голос
/ 10 мая 2009

Для поддержки потоковой передачи я возвращаю Сообщение с переопределением в OnWriteBody ...
Проблема заключается в том, что в OnWriteBody выдается исключение (тайм-аут БД или какой-либо другой)
ProvideFault в IErrorHandler не вызывается, и поэтому у меня нет возможности распространить ошибку клиенту (через фильтрацию в IErrorHandler).
Есть ли способ решить это.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2015

OnWriteBody вызывается, когда заголовки ответа, например 200, уже отправлены клиенту. Там невозможно обрабатывать ошибки на этом этапе. Два обходных пути / трюка, которые я использовал:

  1. Дождитесь первой строки данных перед отправкой 200 (как перед возвратом сообщения) и итерируйте дальнейшие строки внутри OnWriteBody. Это будет работать, потому что большинство ошибок SQL и тайм-аутов происходит до отображения каких-либо данных. Тем не менее, не охватывать случаи, когда ошибка появляется во время итерации набора результатов.
  2. Наличие специального кода обработки ошибок на клиенте и сервере. Мол, в случае ошибки сервер внутри OnWriteBody может сериализовать ошибку и отправить ее как специальный Data-Row. Клиент должен ожидать такую ​​особую строку данных при получении ответа и обрабатывать ее соответствующим образом.
0 голосов
/ 11 мая 2009

при потоковой передаче с WCF я создаю два ServiceContracts, один из которых выполняет потоковую передачу, а другой отправит уведомление в конце потоковой передачи.

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



[ServiceContract]
public interface IStreamFileService
{
  [OperationContract]
  void Upload(Stream stream);
}

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ITransferCallback))]
public interface IStreamFileResponseService
{
  [OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
  Guid StartUpload();
}

[ServiceContract]
public interface ITransferCallback
{
  [OperationContract]
  void OperationComplete(ResponseMessage response);
}

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

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