Обработка ошибок и неверных параметров в сервисе wcf - PullRequest
0 голосов
/ 07 сентября 2010

это может звучать как глупый вопрос, но я не могу найти очевидного ответа.Мне нужно быстро создать простой сервис WCF, и я создал все классы, которые мне нужны, украшенные атрибутами DataContract и DataMember, и я создал собственный класс исключений, и все работает.Однако, если в моем сервисе возникает исключение, независимо от того, что это, я должен всегда выдавать свой FaultException<MyException> с подробным сообщением или использовать другие типы исключений.Я предполагаю, что всегда выкидываю это исключение, так как клиент может обработать этот единственный тип исключения.

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

Большое спасибо

Пол

1 Ответ

2 голосов
/ 07 сентября 2010

WCF поддерживает «два типа» исключений. Первое - это неожиданное исключение - каждое общее исключение .NET, выброшенное из вашего кода, каждое необработанное исключение и каждое неуниверсальное исключение FaultException обрабатывается как непредвиденное исключение. Неожиданным исключением является SOAP: ошибка, которая не описана в WSDL. Неожиданное исключение приводит к сбою канала.

Второй тип - ожидаемые исключения. Ожидаемые исключения определены как FaultContracts. Вы генерируете ожидаемое исключение, используя обобщенное исключение FaultException. Ожидаемые исключения описаны в WSDL как wsdl: сообщения об ошибках для операций. Контракт отказа добавляется как тип XSD для ожидаемого исключения. Благодаря этому клиент может анализировать Detail of SOAP: Fault и предоставлять его как строго типизированный объект. Вы можете предоставить некоторую информацию об исключении в договоре о вине - это только от вас, какую информацию вы предоставляете клиенту.

Когда вы кодируете свой сервис, вы должны различать, что является ожидаемым исключением, а что нет. Например, при создании операции GetDataById ожидаемым исключением является DataNotFound или IncorrectIdFormat и т. Д. Поэтому проверка данных является ожидаемым исключением, и вы можете сказать своему пользователю, какое поле имело неправильное значение. Вы также можете иметь некоторые общие ожидаемые исключения, чтобы обернуть другие неожиданные проблемы - это исключение обычно следует использовать в реализации IErrorHandler в качестве глобального обработчика исключений. Если вы не используете глобальный обработчик исключений, вы не должны иметь дело с неожиданными исключениями.

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