Quantcast
Channel: Visual C# forum
Viewing all articles
Browse latest Browse all 31927

Web Services - Error When Accessing Raw SOAP Messages with Binary Data

$
0
0

I have a class to intercept the SOAP message for a web service call.

public partial class MyServiceClass : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
        XmlReaderSpy _xmlReaderSpy = null;
        XmlWriterSpy _xmlWriterSpy = null;

        #region GetRequestSOAPXml
        // Override reading a response message.
        protected override XmlReader GetReaderForMessage(System.Web.Services.Protocols.SoapClientMessage message, int bufferSize)
        {
            _xmlReaderSpy = new XmlReaderSpy(base.GetReaderForMessage(message, bufferSize));
            return _xmlReaderSpy;
        }

        public string GetRequestXml()
        {
            if (_xmlWriterSpy != null)
                return _xmlWriterSpy.Xml;
            return string.Empty;
        } 
        #endregion

        #region GetResponseSOAPXml
        // Override writing a request message.
        protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
        {
            _xmlWriterSpy = new XmlWriterSpy(base.GetWriterForMessage(message, bufferSize));
            return _xmlWriterSpy;
        }
        public string GetResponseXml()
        {
            if (_xmlReaderSpy != null)
            {
                return _xmlReaderSpy.Xml;
            }
            return string.Empty;
        } 
        #endregion
    }

So the client (service instance) can call GetRequestXml() & GetResponseXml() to get the raw SOAP messages.

But when I had a web method that returned binary data:

public byte[] GetPDFFile()

It failed to get an XmlReader for the response.

It failed on the call : base.GetReaderForMessage(message, bufferSize));  with exception :Message=ReadElementContentAsBase64 method is not supported on this XmlReader. Use CanReadBinaryContent property to find out if a reader implements it.

And the class : SoapHttpClientProtocol doesn't implement a method to read SOAP messages that contains binary data.

I modofied the GetReaderForMessage() as follows but it now throws an exception when I read the stream : Response is not well-formed XML.

Any ideas??

protected override XmlReader GetReaderForMessage(System.Web.Services.Protocols.SoapClientMessage message, int bufferSize)
        {
            XmlReader reader = null;
            int BUFFER_SIZE = 1024;
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = 0;

            Stream newStream = new MemoryStream();
            CopyStream(message.Stream, newStream);
            reader = new XmlTextReader(newStream);
            using (reader)
            {
                do
                {
                    bytesRead = reader.ReadContentAsBase64(buffer, 0, BUFFER_SIZE);
                }
                while (bytesRead > 0);
            }
       }


void CopyStream(Stream src, Stream dest) 
        {
            StreamReader reader = new StreamReader(src); 
            StreamWriter writer = new StreamWriter(dest); 
            writer.Write(reader.ReadToEnd()); 
            writer.Flush(); 
        }

Sorry.. I couldn't find a forum for Web Services.. MSDN has totally changed.

hence posting to Visual C# forum..

Thanks!



Viewing all articles
Browse latest Browse all 31927

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>