tags:

views:

1006

answers:

3

I'm trying to build a C# service in .NET 3.5 that supports both SOAP - and shows the WSDL - and REST.

The SOAP service and WSDL generation was easy enough to do using the ServiceHost and a BasicHttpBinding classes. Got that working and the client was happy.

Because the SOAP calls all used simple parameters, the client developers requested a REST interface for some of the commands. So I changed the ServiceHost class to a WebServiceHost, added necessary WebInvoke and WebGet attributes, added a WebHttpBinding class, and bingo - REST and SOAP were both working out of one service. Way cool, change one interface and both REST and SOAP got the new stuff.

But one problem - the WSDL no longer gets generated. I couldn't browse to http://server/service?wsdl and get the WSDL file. Checking the MSDN docs, that appears to be behavior for a default WebServiceHost.

Question: can I override this behavior so that the WSDL could be obtained? Doesn't have to the same URL as before - it can change - but I just need to have some URL into service to get the WSDL for those SOAP developers.

+2  A: 

When you say "added a WebHttpBinding class", it sounds like you are doing a lot of the configuration in code as opposed to in configuration files.

If this is the case, you could try moving the configuration to the configuration file. Then create 2 endpoints for the contract one REST and one SOAP, with 2 different addresses and bindings.

Shiraz Bhaiji
I do all the configuration in code, not configuration files.One solution is to use two endpoints - and that solution does work just fine. I was hoping to use a single endpoint; a single port and root URL.
Jason Swager
I dont think that you can get a WSDL out of a WebHttpBinding Endpoint.
Shiraz Bhaiji
+2  A: 

But one problem - the WSDL no longer gets generated. I couldn't browse to http://server/service?wsdl and get the WSDL file. Checking the MSDN docs, that appears to be behavior for a default WebServiceHost.

Yes - that's one of the drawbacks of REST - no more WSDL, no more machine-readable service description. You need to hope the service provider gives you a usable and up to date documentation on what you can do.

There's no WSDL for REST - period. Can't be turned on or anything - it just doesn't exist.

There are some efforts under way to provide something similar - called WADL (Web Application Description Language), but as far as I know, it's still far from an established standard by any means. Also see: Do we need WADL?

marc_s
I can understand that REST would have no WSDL, but keep in mind that the service is handling both REST and SOAP requests at the same time. It's just that the SOAP clients can't request a WSDL anymore. The goal was to have a single service, with a single listening port, that could service both REST, SOAP and WSDL, all based on URL path.
Jason Swager