I recently ran into some issues with a third-party web service, and needed view the request xml being sent down the wire. The options came down to using a sniffer to watch HTTP traffic sent from my application or implement a SoapExtension to intercept the different phases of the SOAP request.
My first approach was to use a traffic sniffing tool such as Fiddler. Unfortunately, using Fiddler with SSL Secured Web Services is tricky at best. The process involves a number of changes to Fiddler's configuration. I decided to take another route, but if this is something you are interested in, there is a great in-depth article by Rick Strahl at WestWind Technologies on how to configure Fiddler for HTTP traffic monitoring.
After playing with Fiddler for a while, I decided to take a different approach and use the SoapExtension base class to create a custom extension to intercept request and response data streams. Doing this allows me to do what ever I want with the data. For this purpose, I simply logged the messages to xml files on my local machine, but I could also see using the extension to log xml data to a database.
The MSDN documentation on SoapExtensions shows a decent example, but the best example I found was an article on MSDN Magazine. It includes sample code, and also shows how to use the extension on both the client and the server. On the server you implement the extension using a custom attribute applied your Xml Service Method. On the client, you can add your custom extension in your web.config or app.config section in system.web\soapExtensionTypes.