Comments 11
Пишется один раз свой класс, порождённый от SoapExtension, который включается/выключается через app.config. И не надо влезать с ногами внутрь, как это сделано здесь.
Если вы все равно собираете сообщение в текстовый буфер — то зачем было так все усложнять себе написанием оберток над XmlReader и XmlWriter?
protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
Stream buffer;
if (message.Stream.CanSeek)
buffer = message.Stream;
else
{
buffer = new MemoryStream();
message.Stream.CopyTo(buffer);
buffer.Position = 0;
}
// тут выводим содержимое буфера в лог или куда там было надо
return XmlReader.Create(buffer); // базовый метод еще о кодировке думал, но в большинстве случаев хватит и такого вызова
}
Если же вам нужно сообщение в виде XmlDocument, то все еще проще:
protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
var doc = new XmlDocument();
doc.Load(base.GetReaderForMessage(message, bufferSize));
// тут выводим doc в лог или куда там было надо
return new XmlNodeReader(doc);
}
Правда, последний метод может поломаться если сериализуемое сообщение содержит массив байт, кодируемый в base64 (нужный метод XmlNodeReader не поддерживает).
А еще можно написать наследника SoapExtension и подключить его через конфиг.
PS почему вы отказались от WCF? Ведь WCF-клиентов wsdl.exe генерировать тоже умеет.
Ваш вариант переопределения даже в голову не пришёл если честно, на выходных прогоню тесты, если все пройдет и вы будете не против, то добавлю в статью как более краткую альтернативу.
WCF — мы не отказывались, просто есть ряд проектов, где что называется «исторически сложилось». К тому же писал я не о разнице между ними, и именно о том как сделать для SoapHttpClientProtocol.
SoapExtension — у меня не получилось сделать логирование только для конкретных методов, а с учетом того, что 90% как раз не надо логировать — просто запросы на получение данных, ни к чему не обязывающие, то это было очень критично. Сильно подозреваю, что просто не до разобрался с этим вариантом.
Тем не менее, такой вариант тоже имеет право на жизнь с моей точки зрения.
WCF — мы не отказывались, просто есть ряд проектов, где что называется «исторически сложилось». К тому же писал я не о разнице между ними, и именно о том как сделать для SoapHttpClientProtocol.
SoapExtension — у меня не получилось сделать логирование только для конкретных методов, а с учетом того, что 90% как раз не надо логировать — просто запросы на получение данных, ни к чему не обязывающие, то это было очень критично. Сильно подозреваю, что просто не до разобрался с этим вариантом.
Тем не менее, такой вариант тоже имеет право на жизнь с моей точки зрения.
Хм. А behavior extension тогда что???
Это вы к чему?
К фразе «Тем не менее есть у него один очень серьезный недостаток — это отсутствие штатной возможности получения текста запроса/ответа.». Можно через extension перехватывать запросы и ответы и модифицировать их. Если стоит задача только посмотреть, что улетает/возвращается — diagnostics — messageLogging logEntireMessage=«true»
Sign up to leave a comment.
Получение текста запросов из SoapHttpClientProtocol