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!