Я пытаюсь решить проблему с клиентом веб-службы в моем текущем проекте. Я не уверен в платформе Service Server (скорее всего, LAMP). Я считаю, что на их стороне забора есть ошибка, поскольку я устранил потенциальные проблемы с моим клиентом. Клиент представляет собой стандартный прокси-сервер веб-ссылок типа ASMX, автоматически сгенерированный из WSDL службы.
Мне нужно получить сообщения RAW SOAP (запросы и ответы)
Как лучше всего это сделать?
Вы можете реализовать SoapExtension, который записывает полный запрос и ответ в файл журнала. Затем вы можете включить SoapExtension в web.config, что упрощает включение / выключение в целях отладки. Вот пример, который я нашел и изменил для себя. В моем случае ведение журнала было выполнено с помощью log4net, но вы можете заменить методы журнала своими собственными.
Затем вы добавляете следующий раздел в свой web.config, где YourNamespace и YourAssembly указывают на класс и сборку вашего SoapExtension:
источник
Не уверен, к чему такая возня с web.config или классом сериализатора. Приведенный ниже код работал у меня:
источник
myEnvelope
взялось?Попробуйте Fiddler2, он позволит вам проверять запросы и ответы. Возможно, стоит отметить, что Fiddler работает как с трафиком http, так и с https.
источник
Похоже, что решение Тима Картера не работает, если обращение к веб-ссылке вызывает исключение. Я пытался получить необработанный веб-резонанс, чтобы я мог изучить его (в коде) в обработчике ошибок после того, как возникнет исключение. Однако я обнаружил, что журнал ответов, записанный методом Тима, остается пустым, когда вызов вызывает исключение. Я не совсем понимаю код, но похоже, что метод Тима врезается в процесс после того момента, когда .Net уже аннулировал и отбросил веб-ответ.
Я работаю с клиентом, который вручную разрабатывает веб-службу с помощью низкоуровневого кодирования. На этом этапе они добавляют свои собственные сообщения об ошибках внутреннего процесса в виде сообщений в формате HTML в ответ ПЕРЕД ответом в формате SOAP. Конечно, автоматическая веб-ссылка .Net взрывается по этому поводу. Если бы я мог получить необработанный HTTP-ответ после создания исключения, я мог бы искать и анализировать любой SOAP-ответ в смешанном возвращающемся HTTP-ответе и знать, получили ли они мои данные нормально или нет.
Потом ...
Вот решение, которое работает даже после выполнения (обратите внимание, что я только после ответа - тоже могу получить запрос):
Вот как вы настраиваете это в файле конфигурации:
«TestCallWebService» следует заменить на имя библиотеки (это оказалось именем тестового консольного приложения, в котором я работал).
Вам действительно не нужно переходить на ChainStream; вы сможете сделать это проще из ProcessMessage как:
Если вы посмотрите на SoapMessage.Stream, это должен быть поток только для чтения, который вы можете использовать для проверки данных на этом этапе. Это ошибка, потому что, если вы читаете поток, последующая обработка приводит к ошибкам без обнаруженных данных (поток был в конце), и вы не можете сбросить позицию в начало.
Интересно, что если вы используете оба метода, ChainStream и ProcessMessage, метод ProcessMessage будет работать, потому что вы изменили тип потока с ConnectStream на MemoryStream в ChainStream, а MemoryStream разрешает операции поиска. (Я пробовал преобразовать ConnectStream в MemoryStream - не разрешено.)
Итак ... Microsoft должна либо разрешить операции поиска для типа ChainStream, либо сделать SoapMessage.Stream действительно доступной только для чтения копией, как и должно быть. (Напишите своему конгрессмену и т. Д.)
Еще один момент. После создания способа получить необработанный HTTP-ответ после исключения я все еще не получил полного ответа (как определено анализатором HTTP). Это произошло потому, что, когда веб-служба разработки добавляла сообщения об ошибках HTML в начало ответа, она не настраивала заголовок Content-Length, поэтому значение Content-Length было меньше размера фактического тела ответа. Все, что я получил, это количество символов в значении Content-Length - остальные отсутствовали. Очевидно, что когда .Net читает поток ответа, он просто считывает количество символов Content-Length и не допускает, чтобы значение Content-Length могло быть ошибочным. Это так и должно быть; но если значение заголовка Content-Length неверно, единственный способ получить все тело ответа - это использовать сниффер HTTP (я использую HTTP Analyzer изhttp://www.ieinspector.com ).
источник
Я бы предпочел, чтобы фреймворк вел за вас ведение журнала, подключив поток журналирования, который регистрируется по мере того, как фреймворк обрабатывает этот базовый поток. Следующее не так чисто, как хотелось бы, поскольку вы не можете выбрать между запросом и ответом в методе ChainStream. Вот как я с этим справляюсь. С благодарностью Джону Ханне за отмену идеи стрима
источник
Вот упрощенная версия главного ответа. Добавьте это в
<configuration>
элемент вашего файлаweb.config
илиApp.config
. Он создастtrace.log
файл вbin/Debug
папке вашего проекта . Или вы можете указать абсолютный путь к файлу журнала с помощьюinitializeData
атрибута.Он предупреждает , что
maxdatasize
иtracemode
атрибуты не допускаются, но они увеличивают объем данных , которые могут быть авторизованы, и избежать регистрации все в шестнадцатеричном формате.источник
Вы не указали, какой язык используете, но предполагая, что C # / .NET, вы можете использовать расширения SOAP. .
В противном случае используйте сниффер, например Wireshark.
источник
Я понимаю, что довольно опаздываю на вечеринку, и поскольку язык на самом деле не указан, вот решение VB.NET, основанное на ответе Bimmerbound, на случай, если кто-то наткнется на это и ему понадобится решение. Примечание: у вас должна быть ссылка на класс конструктора строк в вашем проекте, если вы еще этого не сделали.
Просто вызовите функцию, и она вернет строку с сериализованным xml объекта, который вы пытаетесь передать веб-сервису (реально, это должно работать и для любого объекта, который вы хотите передать ему).
В качестве побочного примечания вызов replace в функции перед возвратом xml должен вырезать символы vbCrLf из вывода. У меня их было несколько в сгенерированном xml, однако это, очевидно, будет зависеть от того, что вы пытаетесь сериализовать, и я думаю, что они могут быть удалены во время отправки объекта в веб-службу.
источник