-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] SoapHttpClientProtocol

, 11 2017 . 15:50 +
XelMed 15:50

SoapHttpClientProtocol

.NET SOAP , wsdl.exe. ( C#, cs, ), , SoapHttpClientProtocol. .

, , sgen.exe ( ). /. , , , , .

, , .


- SoapHttpClientProtocol . , , , .

SoapHttpClientProtocol


, SoapHttpClientProtocolSpy, SoapHttpClientProtocol . GetWriterForMessage, GetReaderForMessage. XmlWriter, XmlReader; , XMl, .

:

SoapHttpClientProtocolSpy
   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;
    }


XmlWriterSpy XmlReaderSpy XmlWriter XmlReader.

XmlWriterSpy


, StringWriter, . , StringWriter.

    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); }
   //  ,    

    }


.

XmlWriterSpy


. . , 1 (Read), , , . .

    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("");
                        break;
                    case XmlNodeType.Comment:
                        _sw.Write("");
                        break;
                    case XmlNodeType.Document:
                        _sw.Write("");
                        break;
                    case XmlNodeType.Whitespace:
                        _sw.Write(_baseXmlReader.Value);
                        break;
                    case XmlNodeType.SignificantWhitespace:
                        _sw.Write(_baseXmlReader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        _sw.Write("");
                        break;
                }
                return res;
        }
    }


_baseXmlReader.


, SoapHttpClientProtocolSpy. , , ( ). :


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;
                    }
                }

PS. , . , , SoapHttpClientProtocol, .
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/337672/

:  

: [1] []
 

:
: 

: ( )

:

  URL