К счастью, в спецификации SOAP описано, как при помощи этого протокола исключительное состояние можно передать через Интернет. Эти исключения могут быть исключительными состояниями бизнес-логики или сгенерированными в .NET при обработке вызова. Здесь важно то, что если вы надлежащим образом обернете эти исключения, то клиент должен суметь понять, как ими управлять.
.NET предоставляет объект SoapException для обертывания исключения с целью передачи его через SOAP. Этот класс имеет несколько параметров, которыми вы, возможно, не привыкли пользоваться при работе с исключениями.
□ Message — используется для указания описательного сообщения для исключения. Если вы передаете через SOAP стандартное исключение .NET, то можете установить свойство Message в значение свойства Message стандартного исключения.
□ Code — используется для указания, была ли ошибка связана с сервером или с клиентом. Если клиент передал сообщение верно, но сервер не смог обработать запрос (не работал или был сломан), то вы устанавливаете это свойство в значение Serve г Fault Code. Если клиент передал неверное сообщение или плохие значения параметров, то вы устанавливаете его в значение ClientFaultCode.
□ Actor — используется для установки значения в URI Web-сервиса. Это код, который вызвал исключение.
□ Detail (не обязателен)— используется для передачи дополнительной информации об ошибке. Свойство Detail может не содержать ничего, а может содержать столько подробностей об исключении, сколько вы захотите предоставить.
В листинге 19.8 показана новая версия Web-метода GetCustomerProfile. Эта версия проверяет существование клиента. Если клиент не существует, то выдается SoapException со свойством Code, установленным в значение ClientFaultCode.
[WebMethod(Description = "Used to return a customer's profile.")] public Customer GetCustomerProfile(string customerld) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
Customer customer = custProfile.GetCustomer(customerld); if (customer == null) {
SoapException soapEx = new SoapException("Could not find Customer",
SoapException.ClientFaultCode,
Context.Request.Url.AbsoluteUri.ToString());
throw soapEx; return customer;