Нужно ли обрабатывать CommunicationException на стороне сервера в WCF? - PullRequest
0 голосов
/ 05 июня 2009

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

Спасибо

-Vic

Например, мне нужно сделать следующее?

public MyServiceImpl:IMyService
{

 void DoSomething()
  {
  try{
   //Do something
  }
  catch (Communication exception){}
  catch (Timeout exception){}
  }
 }
}

Ответы [ 2 ]

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

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

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

0 голосов
/ 05 июня 2009

Как обычно: зависит: -)

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

ОДНАКО: если у вас есть сценарий сеанса, где либо ваш транспортный протокол (TCP / IP в случае привязки netTtcp) использует транспортный сеанс, или где, например, ваш. wsHttpBinding устанавливает сеанс приложения с сервером, после чего вам нужно быть абсолютно уверенным на сервере, чтобы он перехватывал все исключения, обрабатывал их и возвращал только как ошибки SOAP.

Если вы этого не сделаете, то канал (канал связи между экземпляром прокси вашего клиента и экземпляром сервера) будет "неисправен", например, невозможно использовать, и экземпляр прокси-клиента необходимо будет воссоздать.

Кроме того, имейте в виду, что исключения .NET - это просто особенность .NET. Если ваш сервис должен быть совместимым и вызываться, например, с. Java, Ruby, PHP или другие клиенты, вы абсолютно ДОЛЖНЫ отлавливать все исключения .NET на стороне сервера и превращать их в ошибки SOAP (которые являются совместимым эквивалентом). Вы можете сделать это, внедрив интерфейс IErrorHandler на стороне вашего сервера.

Марк

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