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!