I have a client that communicates with a web service. The class that I communicate with is a C# class that is generated through wsdl.exe. I now want to log all incoming and outgoing messages.
What I've done so far is to write a class that inherits from the automatically generated C# Class and I have overridden the GetReaderForMessage method. That way I can access the incoming message more or less like this:
protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
System.Xml.XmlReader aReader = base.GetReaderForMessage(message, bufferSize);
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(aReader);
string content = doc.InnerXml.ToString();
System.Xml.XmlReader aReader2 = System.Xml.XmlReader.Create(new System.IO.StringReader(content));
return aReader2;
}
Obviously I'm not too happy with this solution, because basically I'm creating two xml readers. One to read the contents of the SOAP message and one to return to the method caller. Plus I can't really do the same with the GetWriterForMessage method.
But may be I'm just doing things too difficult to start with. Is it for instance possible to read the contents of the SoapClientMessage object directly? I've read some articles suggesting that I should use SoapExtensions here, but from what I can understand, that would only work if the 'client' that I am creating is itself a web service which in this case it is not.
Any suggestions?
Best Answer
You need to use "Add Service Reference" and not "Add Web Reference" feature to use this solution, it can be used if the service is ASMX or WCF. (You need to use .NET Framework 3.X to use this feature)
This article will help you to add the service reference to your C# project.
To intercept and XMLs of the request and the response, Implement these two classes:
Then, change the call code to:
****EDIT**** This is not related with the serverside technology, you can use it with WCF, ASMX, PHP, ... web services, I have tested on: http://www.w3schools.com/webservices/tempconvert.asmx
And got the following XMLs:
requestXML=
responseXML=
****EDIT 2****
"Add Web Reference" is not specialized for ASMX and is not an ASMX client-side technology, and "Add Service Reference"is not the WCF client-side technology, you can use both to add reference to ASMX, WCF, JSP-developed or PHP-developed, web service, you need your application to use .Net framework 3.5 to use "Add Service Reference".
This article mentions: