Как вернуть ошибки из веб-службы ASMX?
-
18-09-2019 - |
Вопрос
Мой метод веб-службы возвращает объект коллекции, это будет хорошо сериализовано, благодаря тому, как работают веб-службы C #!
Но если мой код выдает неперехваченное исключение, я хочу вместо этого вернуть пользовательский объект error .
Возможно ли это с помощью C # ASP.NET v2?
Например,
Нормальная работа должна вернуться:
<Books>
<book>Sample</book>
<book>Sample</book>
</Books>
Но при ошибке я хочу
<error>
<errorMessage></errorMessage>
</error>
Решение
Да, это возможно.
Что вам нужно будет изучить, так это Класс SoapException, и , в частности , Детальное свойство из класса SoapException.
Класс SoapException будет эффективно отображать "Ошибка Soap", который является совместимым со стандартами механизмом для возврата информации об ошибке клиентам / потребителям из метода веб-сервиса.
Свойство "Detail" класса SoapException имеет тип XmlNode - код и, таким образом, может содержать либо один узел / элемент, либо иерархию дочерних узлов.Таким образом, узел Detail может легко содержать и выступать в качестве "родительского" для сериализованного представления вашего собственного пользовательского объекта error.
Из MSDN:
Свойство Detail предназначено для предоставления сведений об ошибке конкретного приложения, связанных с элементом Body запроса SOAP.Согласно спецификации SOAP, если возникает ошибка из-за того, что запрос клиента не может быть обработан из-за элемента Body запроса SOAP, должно быть установлено свойство Detail.Если в записях заголовка запроса SOAP произошла ошибка, вы должны вызвать исключение SoapHeaderException, чтобы сведения об ошибке были возвращены в заголовке SOAP.Если ошибка не возникла из-за обработки элемента Body, то свойство Detail устанавливать не следует.
При создании XmlNode для свойства Detail свойства Name и пространства имен DetailElementName могут использоваться для обеспечения согласованности [sic] со спецификацией SOAP.
Все непосредственные дочерние элементы элемента detail называются элементами detail, и каждая запись detail кодируется как независимый элемент внутри элемента detail.
Обратите внимание, что если вы хотите, чтобы ответы вашей веб-службы оставались корректно совместимыми с SOAP, вам нужно будет вернуть Исключение SoapHeaderException вместо исключения SoapException если ошибка возникает в разделе заголовка клиента исходного XML-запроса (это часто может иметь место при использовании пользовательские заголовки SOAP например, дляучетные данные безопасности), как описано выше.