public class SoapHttpClientProtocolSpy: SoapHttpClientProtocol { private XmlWriterSpy writer; private XmlReaderSpy reader; public SoapHttpClientProtocolSpy() : base(){} protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize) { writer = new XmlWriterSpy(base.GetWriterForMessage(message, bufferSize)); return writer; } protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize) { reader = new XmlReaderSpy(base.GetReaderForMessage(message, bufferSize)); return reader; } public string XmlRequest => reader?.Xml; public string XmlResponce => writer?.Xml; }
public class XmlWriterSpy : XmlWriter { // , , private XmlWriter _me; private XmlTextWriter _bu; private StringWriter _sw; public XmlWriterSpy(XmlWriter implementation) { _me = implementation; _sw = new StringWriter(); _bu = new XmlTextWriter(_sw); _bu.Formatting = Formatting.Indented; } public override void Flush() { _me.Flush(); _bu.Flush(); _sw.Flush(); } public string Xml => _sw?.ToString(); public override void Close() { _me.Close(); _bu.Close(); } public override string LookupPrefix(string ns) { return _me.LookupPrefix(ns); } public override void WriteBase64(byte[] buffer, int index, int count) { _me.WriteBase64(buffer, index, count); _bu.WriteBase64(buffer, index, count); } public override void WriteCData(string text) { _me.WriteCData(text); _bu.WriteCData(text); } // , }
public class XmlReaderSpy : XmlReader { // , , private XmlReader _baseXmlReader; StringWriter _sw; public string Xml => _sw?.ToString(); public XmlReaderSpy(XmlReader xmlReader) { _sw = new StringWriter(); _baseXmlReader = xmlReader; } public override bool Read() { // var res = _baseXmlReader.Read(); // - switch (_baseXmlReader.NodeType) { case XmlNodeType.Element: _sw.Write("<" + _baseXmlReader.Name); while (_baseXmlReader.MoveToNextAttribute()) _sw.Write(" " + _baseXmlReader.Name + "='" + _baseXmlReader.Value + "'"); _sw.Write(_baseXmlReader.HasValue || _baseXmlReader.IsEmptyElement ? "/>" : ">"); // , _baseXmlReader.MoveToElement(); break; case XmlNodeType.Text: _sw.Write(_baseXmlReader.Value); break; case XmlNodeType.CDATA: _sw.Write(_baseXmlReader.Value); break; case XmlNodeType.ProcessingInstruction: _sw.Write("<?" + _baseXmlReader.Name + " " + _baseXmlReader.Value + "?>"); break; case XmlNodeType.Comment: _sw.Write("<!--" + _baseXmlReader.Value + "-->"); break; case XmlNodeType.Document: _sw.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Whitespace: _sw.Write(_baseXmlReader.Value); break; case XmlNodeType.SignificantWhitespace: _sw.Write(_baseXmlReader.Value); break; case XmlNodeType.EndElement: _sw.Write("</" + _baseXmlReader.Name + ">"); break; } return res; } }
using (var worker = new Service()) { try { res = worker.Metod(....); Log.Info((worker?.XmlRequest ?? "")+(worker?.XmlResponce ?? "")); } catch (System.Exception ex) { Log.Error((worker?.XmlRequest ?? "")+(worker?.XmlResponce ?? "")); throw ex; } }
Source: https://habr.com/ru/post/337672/
All Articles