Как вернуть ошибки из веб-службы ASMX? - PullRequest
6 голосов
/ 20 июля 2009

Мой метод веб-службы возвращает объект коллекции, он будет хорошо сериализован благодаря работе веб-служб C #!

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

Возможно ли это с помощью C # ASP.NET v2?

Например,

Нормальная операция должна вернуть:

<Books>
    <book>Sample</book>
    <book>Sample</book>
</Books>

Но по ошибке я хочу

  <error>
      <errorMessage></errorMessage>
  </error>

1 Ответ

7 голосов
/ 20 июля 2009

Да, это возможно.

Вам нужно изучить класс SoapException и, в частности, свойство Detail класса SoapException.

Класс SoapException будет эффективно отображать « Soap Fault », который является совместимым со стандартом механизмом возврата информации об ошибках клиентам / потребителям из метода веб-службы.

Свойство «Detail» класса SoapException имеет тип XmlNode и может, таким образом, содержать либо один узел / элемент, либо иерархию дочерних узлов. Поэтому узел Detail может легко содержать и выступать в роли «родителя» для сериализованного представления вашего собственного пользовательского объекта ошибки.

Из MSDN:

Свойство Detail предназначено для предоставления подробных сведений об ошибках приложения, связанных с элементом Body запроса SOAP. В соответствии со спецификацией SOAP, если возникает ошибка из-за невозможности обработки клиентского запроса из-за элемента Body запроса SOAP, необходимо установить свойство Detail. Если в записях заголовка запроса SOAP произошла ошибка, необходимо сгенерировать исключение SoapHeaderException, чтобы сведения об ошибке возвращались в заголовке SOAP. Если ошибка не возникла из-за обработки элемента Body, свойство Detail не должно устанавливаться.

При создании XmlNode для свойства Detail можно использовать свойства Name и Namespace для DetailElementName, чтобы обеспечить согласованность [sic] со спецификацией SOAP.

Все непосредственные дочерние элементы элемента detail называются записями подробностей, и каждая запись подробностей кодируется как независимый элемент внутри элемента detail.

Обратите внимание, что если вы хотите, чтобы SOAP-код корректно соответствовал вашим ответам веб-службы, вам необходимо вернуть SoapHeaderException , а не SoapException , если , ошибка возникает в клиенте. Раздел заголовка исходного XML-запроса (это часто может иметь место при использовании пользовательских заголовков SOAP , например, для учетных данных безопасности), как описано выше.

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