Вероятно, наиболее подходящим шаблоном 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.