Pull to refresh

Comments 11

UFO just landed and posted this here
Пишется один раз свой класс, порождённый от 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% как раз не надо логировать — просто запросы на получение данных, ни к чему не обязывающие, то это было очень критично. Сильно подозреваю, что просто не до разобрался с этим вариантом.
Тем не менее, такой вариант тоже имеет право на жизнь с моей точки зрения.
К фразе «Тем не менее есть у него один очень серьезный недостаток — это отсутствие штатной возможности получения текста запроса/ответа.». Можно через extension перехватывать запросы и ответы и модифицировать их. Если стоит задача только посмотреть, что улетает/возвращается — diagnostics — messageLogging logEntireMessage=«true»

А каким боком behavior extension относится к классу SoapHttpClientProtocol?

Ну у вас же стоит задача выцепить текст SOAP request/reply в варианте автогенерации класса клиента из wsdl. Behavior extension решает эту задачу. Либо настала моя очередь спрашивать «Это вы к чему?»

Как вы добавите behavior extension к SoapHttpClientProtocol?


Вы вообще видите разницу между WCF и старым System.Web.Services?

Да, каюсь, промахнулся…
Sign up to leave a comment.

Articles