Информация об изменениях

Сообщение [WCF] Получить SOAP XML в клиенте до отправки запроса от 16.10.2019 6:24

Изменено 16.10.2019 6:27 HeaveN

[WCF] Получить SOAP XML в клиенте до отправки запроса
Привет всем!

Может кто сталкивался с задачей.
Есть прокси, сформированный по 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 выглядит вот так:
[WCF] Получить SOAP XML в клиенте до отправки запроса
Привет всем!

Может кто сталкивался с задачей.
Есть прокси, сформированный по 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 вообще не найден нужный объект.

Заранее спасибо.