Как перехватить исходящие и входящие сообщения мыла от клиентского веб-прокси C # - PullRequest
2 голосов
/ 02 ноября 2009

Я пишу интерфейс для тестирования веб-службы asmx. Сервер и клиент .NET. Клиентский прокси был создан с использованием wsdl.exe.

Я хотел бы перехватить и сохранить строковое представление исходящих и входящих SOAP сообщений, сгенерированных в результате вызова методов на веб-прокси, чтобы я мог добавить функцию в пользовательский интерфейс, которая будет отображать сообщение только что отправлено / получено.

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

Любые намеки и помощь с благодарностью.

(Я частично реализовал SoapExtension. Я не понимаю, как работает метод ChainStream, и я не уверен, как уведомить слушателя о том, что мыльное сообщение было перехвачено (так как я не контролирую создание расширения мыла).

Ответы [ 4 ]

1 голос
/ 11 августа 2016

Еще один способ захвата XML отправляется через приложение Wireshark . Перехватывает коммуникационную сетевую карту.

В моем случае я вызвал службу, которая в качестве части его адреса указала строку PIOSOS . Я использовал окно Find Packet и искал.

Затем найдите XML.

Смотри картинку.

(я знаю ... это не программный способ, но он имеет свою ценность. Lol)

enter image description here

1 голос
/ 07 ноября 2009

Вы на правильном пути с SoapExtension. Вы видели документацию и пример здесь? http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx

Идея ChainStream состоит в том, что вы получаете сетевой поток, в который будет записан запрос, и у вас есть возможность вернуть другой поток. Поэтому, если вы хотите сохранить копию запроса, верните MemoryStream, в который клиент веб-служб запишет запрос, а затем в вызове ProcessMessage вы можете скопировать данные оттуда и передать их в свой пользовательский интерфейс. *

0 голосов
/ 07 ноября 2009

Вам бы лучше было использовать WCF в качестве клиентской технологии. Затем вы можете просто использовать трассировку на уровне сообщений WCF для регистрации входящих и исходящих сообщений. Это делается просто через настройку.

Нет причин, по которым вам нужно использовать клиент ASMX только потому, что вы используете сервис ASMX.

0 голосов
/ 02 ноября 2009

Я бы предложил 2 трюка:

  • наследование прокси и перегрузка ваших методов (немного скучно, но вы можете сгенерировать код, как в этом проекте: http://ftwsf.codeplex.com/)
  • с использованием асинхронных подписей и подписки на «Завершенные» события каждого метода (вы можете сделать это с помощью отражения, чтобы избежать записи большого количества кода)

Если вам нужна дополнительная информация об этих хитростях, просто дайте мне знать.

...