Какой тип исключения должен создаваться службой WCF? - PullRequest
5 голосов
/ 05 октября 2009

Я конвертирую код из ASMX в WCF. В моих веб-сервисах ASMX я отбрасываю исключения SOAP, такие как:

if (ex.InnerException != null)
                {
                    SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException);
                    throw se;
                }

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

Ответы [ 2 ]

20 голосов
/ 05 октября 2009

По сути, в службе WCF лучше всего, когда вы бросаете только FaultException (или FaultException<T>).

Это происходит из-за двух вещей: поскольку WCF разработан для обеспечения взаимодействия (ваш клиент может легко быть приложением, отличным от .NET), вы не должны использовать исключения .NET - они слишком зависят от платформы. И второе: если вы используете FaultExceptions (которые преобразуются в ошибки SOAP), ваш канал (соединение между клиентом и сервером) не будет разорван или «неисправен». Среда выполнения WCF на стороне сервера рассматривает все необработанные исключения .NET как «серьезные» исключения и, таким образом, переводит канал в сбойное состояние, предполагая, что произошло что-то действительно плохое.

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

Если вы хотите (или должны) быть очень функционально совместимыми, вы должны определить, что ваши ошибки SOAP контракты ошибок (аналогично контрактам на данные) в отдельном файле, и затем вы выбросите FaultException<T> где T будет одним из ваших контрактов по вине. Если вы строго .NET по обе стороны, вы также можете вставить исключения .NET в FaultException в качестве универсального типа T, если хотите - канал не будет поврежден (например, вы можете выбросить FaultException<InvalidOperationException> и, таким образом, дать сигнал назад что пошло не так).

3 голосов
/ 05 октября 2009

В WCF вы используете FaultException. См. Например здесь .

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