Как получить ответ SOAP, когда возникла исключительная ситуация? - PullRequest
3 голосов
/ 16 февраля 2011

Я позвонил в сторонний веб-сервис и получил исключение ESOAPHTTP с сообщением в следующем формате:

Загадочное сообщение здесь - URL: http://webserviceurl - SOAPAction: executeWithArgList

Теперь сотрудники службы поддержки этого веб-сервиса запросили полный ответ SOAP.Обычно я присоединяю обработчик событий к THTTPRIO.OnAfterExecute и просто сохраняю содержимое потока, который я получаю, в качестве параметра.

Но поскольку Delphi вызывает исключение, этот обработчик событий не выполняется.Я понимаю, что на самом деле исключение может означать, что служба потерпела неудачу каким-то катастрофическим образом, но все равно должен быть какой-то ответ (не ошибка тайм-аута).

Есть ли какой-то другой метод, который я могу использовать дляперехватить ответ до Delphi превращает его в исключение?

Ответы [ 3 ]

6 голосов
/ 16 февраля 2011

Для исключения на основе ERemotableException вы хотели бы посмотреть на событие OnAfterExecute, поскольку оно представляет ошибку, отправленную обратно службой ... но для ESOAPHTTPException (ваш случай) вам нужно обработать событие OnWinInetError (http://docwiki.embarcadero.com/VCL/en/SOAPHTTPTrans.THTTPReqResp.OnWinInetError).

D2010 представил ошибку в обработке SOAP HTTP. Типичным симптомом является то, что он пропустит сбои HTTP (например, когда сервер занят). Поэтому, возможно, это не та проблема, с которой вы сталкиваетесь, но, не зная точного кода ошибки или сообщения, которое вы видите, никто не может сказать. Вы можете найти более подробную информацию здесь: https://forums.embarcadero.com/message.jspa?messageID=304898&tstart=0

Например, если вы получаете сообщение об ошибке «Хэндл находится в неправильном состоянии», проблема, упомянутая выше, является виновником. Это означает, что «Отправить» не удалось, но среда выполнения успешно продолжила читать ответ. Вы можете узнать больше об этом из этой темы: https://forums.embarcadero.com/message.jspa?messageID=307048.

Таким образом, вы должны обработать OnWinInetError и получить код ошибки (параметр LastError). Это, вероятно, ключ к пониманию неудачи.

Приветствия

Брюно

1 голос
/ 16 февраля 2011

Я бы открыл исходный код SOAPHTTPTrans и поместил точку останова в THTTPReqResp.Check (), прямо внутри «if error».Когда вы достигнете точки останова, у вас будет больше представления о том, что не так.Посмотрите на стек вызовов, чтобы увидеть, как вы попали сюда.Возможно, что-то пошло не так, когда ваш запрос создан и отправлен.Если это происходит во время отправки, то, скорее всего, он никогда не будет выходить в сеть, поэтому вы не увидите его с помощью WireShark, Fiddler или SoapUI.

IMO, функции вроде Check () должны иметь дополнительный параметр для CallerLocation, чтобы вместо вызова этого вызывать: Check (not Assigned (Request), False);Вы бы назвали это: Check (не Назначено (Запрос), False, 'THTTPReqResp.SendGet');и Check добавит CallerLocation к сообщению об ошибке, и вы узнаете (много) больше о том, что происходит.

1 голос
/ 16 февраля 2011

Да, вы можете использовать событие RIO для проверки ответа до его десериализации.

OnAfterExecute

Вы получите ответ в виде потока, который можно преобразовать в строку,Затем вы можете проверить наличие плохих вещей, таких как исключения, beign полностью пустым или начать с '', что обычно (в моем случае) означает, что служба не работает.

...