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