You can expose the service in two different endpoints.
the SOAP one can use the binding that support SOAP e.g. basicHttpBinding, the RESTful one can use the webHttpBinding. I assume your REST service will be in JSON, in that case, you need to configure the two endpoints with the following behaviour configuration
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
An example of endpoint configuration in your scenario is
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="ITestService"/>
</service>
</services>
so, the service will be available at
Apply [WebGet] to the operation contract to make it RESTful.
e.g.
public interface ITestService
{
[OperationContract]
[WebGet]
string HelloWorld(string text)
}
Note, if the REST service is not in JSON, parameters of the operations can not contain complex type.
Reply to the post for SOAP and RESTful POX(XML)
For plain old XML as return format, this is an example that would work both for SOAP and XML.
[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate = "accounts/{id}")]
Account[] GetAccount(string id);
}
POX behavior for REST Plain Old XML
<behavior name="poxBehavior">
<webHttp/>
</behavior>
Endpoints
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="ITestService"/>
</service>
</services>
Service will be available at
REST request
try it in browser,
http://www.example.com/xml/accounts/A123
SOAP request
client endpoint configuration for SOAP service after adding the service reference,
<client>
<endpoint address="http://www.example.com/soap" binding="basicHttpBinding"
contract="ITestService" name="BasicHttpBinding_ITestService" />
</client>
in C#
TestServiceClient client = new TestServiceClient();
client.GetAccount("A123");
Another way of doing it is to expose two different service contract and each one with specific configuration. This may generate some duplicates at code level, however at the end of the day, you want to make it working.
Had the same problem, disabled the help page and it fixed it. The exception was being thrown if some REST urls were called in a sequence very quickly. It was fine when waiting between the calls.
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
}
Best Answer
After spending a tremendous amount of time playing with different .net rest frameworks I've come to a conclusion. Using asp.net mvc is by far the easiest and most transparent way to handle restful services. There is a whole lot less confusing configuration.
Asp.net MVC
By it's very nature, asp.net mvc fits the restful service methodology. Rather than taking a complicated soap-driven framework and "adapting" it to the restful protocol, asp.net mvc embraces the web programming paradigm at it's core. It's much more transparent and easy to debug. Using the asp.net routing framework, iis requests are wired up to controller classes. Returning any type of content is a breeze. Getting setup is much easier because of the Convention over Configuration philosophy. It just works. 'Nuff said.
Here is the list of projects that I played with while trying to get wcf to work well with rest. I spent days learning about the different approaches. In the end, there were things I liked about each one, but there was nothing that took care of all of our needs. Mvc wins.
WCF Rest Projects
WCF Rest Contrib - wcfrestcontrib.codeplex.com
This project has some really helpful features like zero configuration, error handling (for returning proper web response codes), and web authentication.
It requires you to change the service factory class which creates your wcf service. This means that it cannot play well with other libraries that require you to use their factory.
WCF Rest Starter Kit - code.msdn.microsoft.com/wcfrestlabs/
This is really just a "learning tool" and lab to show how rest could be implemented in wcf. It does not look like it's being updated any more. I think asp.net mvc and wcf 4.0 has taken the wind out of it's sales. It does have some good classes which did end up getting incorporated into wcf 4.0 (Help feature).
Documentation Tools
WCF Rest AutoDocs - autodocs.codeplex.com
Generates really cool, easy to use documentation based on attributes and a new endpoint behavior adapter class.
I hit a big snare with this. When I added it to WCF suddenly posts no longer worked. I kept getting an endpoint not found error. I eventually gave up and stopped using the library. Did not work well with other libraries.
WCF Doc - wcfdoc.codeplex.com
Generates documentation for soap and rest based services. You can create your own xslts and generate cool looking documentation based on your company's branding. I'm currently integrating this into our build process.