From the trenches: WseWsdl2.exe
This post has been deprecated by WSE 2.0 SP1 (they've added the "name" commandline parameter to wsewsdl2.exe).
"This WSDL to SoapClient tool generates proxy code for Web service clients from WSDL files."
The documentation states you can retrieve the WSDL via soap.tcp:
"Soap.tcp locations will be retrieved with a SOAP message ("GetDescription")."
Well, the documentation is not correct. First of all its not GetDescription but RequestDescription. Second, you need to inherit from SoapService in order to get the RequestDescription out-of-the-box. The GetDescription method exists in the SoapReceiver class and by default returns null. So if you happen to inherit from SoapReceiver(which BTW SoapService inherits from), you can provide an implementation for SoapReceiver.GetDescription. But this buys you nothing. You need to provide a method with a SoapMethodAttribute which has a value of SoapReceiver.RequestDescriptionAction (== "http://schemas.microsoft.com/wse/2003/06/RequestDescription").
Nevertheless, I did not get it to work properly (the proxy generation using soap.tcp that is). I kept on getting "Microsoft.Web.Services2.Addressing.AddressingFault: Destination Unreachable". On the net I found one other place where this was mentioned, but no reply. The funny thing is, that if I requested the description using a self-fabricated class inheriting from SoapClient and defined the RequestDescription method using the proper SoapMethod attribute, I got the WSDL back. So I started digging a little using Reflector and came to the conclusion that there was only one main difference between WseWsdl2 and my custom implementation. I used an EndPointReference with both an Address and a Via to initialize SoapClient, whereas WseWsdl2 used the constructor of EndPointReference specifying only the Address. So I changed my code to use the same constructor, and low and behold, I got the same error. If address (specified on the SoapService itself via the SoapActor attribute) and via are the same, WseWsdl2 should work over soap.tcp!
I whipped up a little tool to call the soap.tcp RequestDescription method using the proper EndPointReference constructor.
Usage: soaptcpwsdl /address:<uri> /via:<uri> /output:<wsdl file>
You can use WseWsdl2 on the wsdl output to generate the proxy class.
UPDATE: Seems like I'm not the only one experimenting [http://weblogs.asp.net/gsusx/archive/2004/06/08/151351.aspx]
UPDATE: Aaron Skonnard points out the use of WseWsdl2 [http://www.pluralsight.com/aaron/default.aspx?key=2004-06-04T21:48:22Z]