Время ожидания Microsoft.Web.Services2.SoapClient.SendRequestResponse истекло, хотя сервер отвечает сообщением SOAP. - PullRequest
0 голосов
/ 14 октября 2011

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

Сценарий:

  • у нас есть приложение, которое создает SOAP-запрос из файла шаблона xslt и использует несколько параметров, включая MessageID
  • реальный сервис, к которому он обращается, например запросы, счастливо отвечает, и наш клиент обрабатывает ответ счастливо
  • мы пытаемся создать заглушку / ответчик, имитирующий службу
  • заглушка просто реализует IHttpHandler и отвечает на любую операцию POST
  • заглушка читает из XML-файла стандартный ответ, являющийся примером реального ответа, и отправляет его по сети
  • и Visual Round Trip Analyzer (NetMon под капотом) и Fiddler видят, как ответ проходит по проводам к клиенту
  • SendRequestResponse со временем истекает и выдает исключение

1 Ответ

0 голосов
/ 17 октября 2011

SoapClient.SendRequestResponse знает о MessageID в заголовке SOAP исходящего запроса и не завершит вызов, пока не получит сообщение со значением RelatesTo, которое соответствует исходному MessageID.Таким образом, если вы создаете ответчик / заглушку, вы сильно выделяете MessageID из запроса и вставляете его в поле RelatesTo в заголовке SOAP ответа.

Немного странно, что он не просто возвращается после любого действительного сообщения SOAP и выдает исключение из-за несоответствия.Возможно, это является частью стандарта веб-сервисов SOAP.Я не смотрел на это.

Пример:

Запрос:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd="http://www.w3.org/2001/XMLSchema/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
  <soap:Header>
    <wsa:MessageID soap:mustUnderstand="1">uuid:20E6C5D8-2E0D-48D0-863D-7789D2CA37A2</wsa:MessageID>
...

Ответ:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
  <soap:Header>
    <wsa:MessageID SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">uuid:bb1cf43050739c45:248138d0:1328e31d4e2:-5cf4</wsa:MessageID>
    <wsa:RelatesTo RelationshipType="wsa:Reply" SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">uuid:20E6C5D8-2E0D-48D0-863D-7789D2CA37A2</wsa:RelatesTo>
...

Значение RelatesTo такое жев качестве значения MessageID в запросе.MessageID в ответе является новым и уникальным, поскольку ответное сообщение не является сообщением запроса.

...