WCF - выбросить исключение или FaultException?

Что эффективнее? Выдавать исключение или выдавать ошибку ... как я вижу, есть 2 сценария:

  1. Произошло исключение, которое было перехвачено. Вы выбрасываете существующий Exception или создаете новый FaultException и бросаете его?

  2. Ваша собственная логика (например, имя пользователя не может быть пустым) должна выдавать ошибку либо в виде исключения, либо в виде исключения FaultException. Что вы выберете?

В принципе, какой способ лучше всего использовать? Я спрашиваю, потому что я помню, что где-то читал об исключениях WCF бокса или распаковки, и это требует дополнительных ресурсов и тому подобного ... так что я тоже думаю, что является более эффективным способом?


person michael    schedule 19.05.2011    source источник


Ответы (4)


Исходя из перспективы контракта WSDL, каждая операция может иметь не более одного ответа. Однако вы можете определить несколько контрактов на сбой, которые в основном говорят клиенту: «Ожидайте либо ответа, определенного DataContractX, либо ответа сбоя, определенного FaultContractY или FaultContractZ».

Использование FaultExceptions позволяет вам лучше контролировать то, как представлен ваш WSDL (или при написании совместимой службы на основе уже определенного WSDL).

Если вы действительно пытаетесь добиться взаимодействия и полностью используете для этого wsdl и soap, вам нужно будет использовать FaultExceptions. Если вы используете WCF в взаимодействии только с .NET, вы можете использовать исключения или исключения сбоев, я не думаю, что разница в производительности будет значительной (общение по сети на порядок значительнее, чем среда выполнения WCF, переносящая исключения в общий Неисправность передачи по проводу).

person Ethan Cabiac    schedule 19.05.2011

Это может зависеть от того, где и как вы хотите обрабатывать исключение. Клиент (независимо от платформы) всегда будет получать исключение ошибки мыла независимо от того, допускает ли код службы необработанные исключения, служба явно генерирует исключение FaultException или генерирует общую версию FaultException.

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

Обработка исключений всегда является дорогостоящим процессом, но нет реальной разницы в производительности между выдачей исключения FaultException или любого другого исключения .NET на стороне службы.

person Sixto Saez    schedule 19.05.2011

Насколько я понимаю, если вы используете wsHttpBinding и вы генерируете исключение .Net, а не FaultException, канал сервер-клиент будет в состоянии сбоя, и объект класса прокси необходимо будет воссоздать, поскольку существующий объект прокси будет непригодным для использования. Поэтому лучше всего использовать FaultException.

person Padmika    schedule 31.03.2014

Если вы просто создаете исключение с помощью «Exception», служба WCF вызовет FaultExceptionin позади, и основная причина исключения никогда не будет известна клиенту, если вы не укажете <serviceDebug includeExceptionDetailInFaults="true"/> в web.config. Если вы хотите, чтобы клиент знал причину / настраиваемое сообщение об исключении, предпочитайте FaultException. Лучше всего иметь нестандартно типизированное исключение.

person Omkar Manjare    schedule 14.08.2017