Ошибка SOAP Webservice - практика проектирования - PullRequest
4 голосов
/ 21 ноября 2008

Мне нужно разработать API-интерфейс SOAP (мой первый!). Каковы лучшие практики в отношении ошибок, возвращаемых вызывающей стороне.

Предполагая API следующим образом

[WebMethod]
public List<someClass> GetList(String param1)
{
}

Должен ли я

  • Брось исключение. Позвольте инфраструктуре SOAP генерировать ошибку SOAP - и вызывающая сторона должна будет попытаться / перехватить. Это не очень объяснительно для звонящего
    1. Пусть возвращаемым параметром будет какой-либо XMLDOcument, причем первым элементом будет возвращаемое значение, а затем List.
    2. Глядя на возвращаемый SOAP-пакет, я вижу, что сгенерированный ответ выглядит следующим образом

 <GetListResponse>
   <GetListResult>
     ...
     ...   
 </GetListResult>
</GetListResponse> 

Можем ли мы каким-то образом изменить возвращаемый пакет, чтобы в случае ошибки элемент "GetListResult" был заменен на "GetListError"

  • Любой другой способ?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 ноября 2008

Вероятно, наиболее подходящим шаблоном SOA, который будет следовать, будет Fault Contract, который по сути является Data Contract, заключенным в SOAPException.

Я публикую примеры в .NET, так как похоже, что это то, что вы используете (и это то, что я знаю :))

В WCF вы можете определить DataContract, а затем украсить свой интерфейс OperationContract атрибутом "FaultContract", который указывает его в качестве возвращаемого значения:

public partial interface MyServiceContract
{
    [System.ServiceModel.FaultContract(typeof(MyService.FaultContracts.ErrorMessageFaultContract))]
    [System.ServiceModel.OperationContract(...)]
    ResponseMessage SOAMethod(RequestMessage request) {...}
}

Для веб-служб ASMX (как вы видите, из своего фрагмента кода) вы не можете использовать этот атрибут или настройку. Таким образом, чтобы реализовать шаблон, вам необходимо:

  • Определите сериализуемый класс для хранения информации об исключении (т. Е. ErrorData)
  • Когда в вашем сервисе возникает исключение, перехватите его и в своем коде обработки ошибок добавьте информацию в класс ErrorData
  • Добавьте сериализованный класс ErrorData к классу SoapException:

    SoapException mySoapException = new SoapException(message, SoapException.ServerFaultCode, "", serialzedErrorDataClass);
    
  • Добавьте исключение SoapException в ваш код

  • На стороне клиента вам потребуется десериализовать сообщение, чтобы интерпретировать его.

Вроде бы много работы, но таким образом вы полностью контролируете, какие данные возвращаются. Кстати, это шаблон, который используется ServiceFactory из шаблонов и практик Microsoft для веб-служб ASMX.

1 голос
/ 23 июня 2009

Вы можете вызвать возврат правильной ошибки из старых сервисов ASMX, но это нелегко. Прежде всего, вам придется вручную кодировать WSDL, потому что инфраструктура ASMX никогда не будет создавать элементы Fault в WSDL. Затем необходимо сериализовать нужные данные об ошибках в элемент XmlElement, который вы затем предоставите в качестве свойства Detail объекта SoapException, которое вы выбросите.

С WCF намного проще. Вы можете объявить несколько FaultContracts для каждой операции, и WCF сгенерирует правильный WSDL для ссылки на них. Затем вы просто выбрасываете FaultException, где тип T - это тип FaultContract. Передайте экземпляр T в конструктор, и все готово.

1 голос
/ 23 июня 2009

* * * * * * * * * * * * * * * * * * * * * * * * * * * *

0 голосов
/ 23 июня 2009

Я не могу дать вам указания для .net (что, кажется, то, что вы спрашиваете), но SOAP предоставляет механизм для выражения строго типизированных исключений. Элемент ошибки SOAP может иметь дополнительный подэлемент FaultDetail, и он может содержать произвольные XML-документы, такие как ваш GetListError. Эти типы документов должны быть определены в WSDL как wsdl: fault внутри wsdl: operation

Хитрость заключается в том, чтобы убедить стек веб-службы превратить исключение (которое является «правильным» способом написания вашей бизнес-логики) в должным образом упорядоченную информацию об ошибках. И я не могу помочь тебе с этим.

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