[WCF] Получить SOAP XML в клиенте до отправки запроса
От: HeaveN Россия  
Дата: 16.10.19 06:24
Оценка:
Привет всем!

Может кто сталкивался с задачей.
Есть прокси, сформированный по wsdl. Создается набор объектов, которые потом сериализуются в SOAP-сообщение и отправляются на сервер.
Клиент унаследован от ClientBase.

Надо ДО попытки отправки сообщения получить содержимое <S:Body> в XML, по результатам анализа либо дописать дополнительную ветку руками, либо не отправлять сообщение.
Попытки закончились на том, что я создал класс с интерфейсом IClientMessageInspector, добавил Behavior в EndPoint и могу в BeforeSendRequest увидеть сформированное сообщение. Однако, отменить отправку, как я понимаю, уже нельзя и руками при необходимости дописать туда нормально не получается.


public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
// .......
XmlDocument xmlDoc .....;
// .......
string msgXMLStr = xmlDoc.OuterXml;

var bytes = Encoding.UTF8.GetBytes(msgXMLStr);
var reader = XmlDictionaryReader.CreateTextReader(bytes, XmlDictionaryReaderQuotas.Max);

request = Message.CreateMessage(reader, Int32.MaxValue, request.Version);
System.Diagnostics.Trace.WriteLine(request.ToString());

return request;
}


До изменения сообщение в лог пишется нормально. После изменения Body выглядит вот так:

<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">... поток ...</s:Body>


Отправляется, похоже, тоже битым, потому что сервер на него реагирует ответам, что в Body вообще не найден нужный объект.

Заранее спасибо.
Нет такого закона, что человеку летать нельзя...
Отредактировано 16.10.2019 6:27 HeaveN . Предыдущая версия .
Re: [WCF] Получить SOAP XML в клиенте до отправки запроса
От: Sharov Россия  
Дата: 16.10.19 11:09
Оценка:
Здравствуйте, HeaveN, Вы писали:

HN>Привет всем!


HN>Может кто сталкивался с задачей.

HN>Есть прокси, сформированный по wsdl. Создается набор объектов, которые потом сериализуются в SOAP-сообщение и отправляются на сервер.
HN>Клиент унаследован от ClientBase.

HN>Надо ДО попытки отправки сообщения получить содержимое <S:Body> в XML, по результатам анализа либо дописать дополнительную ветку руками, либо не отправлять сообщение.

HN>Попытки закончились на том, что я создал класс с интерфейсом IClientMessageInspector, добавил Behavior в EndPoint и могу в BeforeSendRequest увидеть сформированное сообщение. Однако, отменить отправку, как я понимаю, уже нельзя и руками при необходимости дописать туда нормально не получается.

HN>Отправляется, похоже, тоже битым, потому что сервер на него реагирует ответам, что в Body вообще не найден нужный объект.


Скорее всего сервер не может десериализовать, т.к. меняете структуру объекта, создавая какую-то ветку. Возможно, что проблемы с цифровой подписью -- до и после не совпадают.
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.