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