Reputation: 13146
I'm new to WCF and am trying to get some ideas I have off the ground.
Basically I have a web WCF Application project with the following in its web.config:
<system.serviceModel>
<services>
<service name="WcfService1.ServiceContract.IDirectorySearchService" behaviorConfiguration="defaultServiceBehavior">
<endpoint name="restxml" address="xml" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceXml" behaviorConfiguration="xmlRestBehavior"/>
<endpoint name="restjson" address="json" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceJson" behaviorConfiguration="jsonRestBehavior"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchService"/>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="defaultServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="xmlRestBehavior">
<webHttp/>
</behavior>
<behavior name="jsonRestBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
My interfaces look like this:
[ServiceContract]
public interface IDirectorySearchServiceXml
{
[OperationContract]
[WebGet(UriTemplate = "Search/")]
SearchResults Search();
}
[ServiceContract]
public interface IDirectorySearchServiceJson
{
[OperationContract]
[WebGet(UriTemplate = "Search/")]
SearchResults Search();
}
[ServiceContract]
public interface IDirectorySearchService
{
[OperationContract]
SearchResults Search(int? sportId, int? instituteId, DateTime? startDate, DateTime? endDate);
}
Now the part I am having a little trouble with is what else I need to get this up and running... Like given this what .svc files do I need and do I have the config right... Also what addresses do I need to use to get this running either through the browser or through the WCF test client. Note I am currently using 3.5.
Cheers Anthony
UPDATE:
So If I have something like the following, I would need 3 different svc files... If this is the case then there isn't much point in having address part in the end point...
public class DirectorySearchServiceXml : IDirectorySearchServiceXml
{
...
}
public class DirectorySearchServiceJson : IDirectorySearchServiceJson
{
...
}
public class DirectorySearchService : IDirectorySearchService
{
...
}
But I could create 1 class that exsplictly implments all 3 interfaces, then I would only have 1 svc and then the address becomes relevent... Is that correct?
Upvotes: 3
Views: 4581
Reputation: 1186
Just to add to this discussion.
I was faced with the same problem and I ended up going with the use of a partial class.
Each endpoint can be implemented by a different interface as you have done, but your svc file refers to a single class name, you then split your class into partial classes and here's the clever bit, each partial class can implement a different interface.
You can then keep your implementations and interfaces separate but still get around the need for the svc file to refer to one class.
Upvotes: 0
Reputation: 4245
I also had some problems with multiple endpoints within one service. I always got error 400. My error was not to use different addresses in the web.config. So it´s important to use different address= configurations for every endpoint (example is in the 1st post). One endpoint can omit it or leave it empty. All others need it.
Upvotes: 1
Reputation: 754200
It depends :-)
If you want to host your WCF services in IIS (check out MSDN How To: Host a WCF Service in IIS) as I assume from your question, then you need three things:
The service file (*.svc) is just a tiny one-line text file to instruct IIS how to create your service. It looks like this:
<%@ServiceHost language=c# Debug="true"
Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
The language
attribute defines the language of the WCF service, debug
enables debugging (for dev and test, disable it for production), and the Service=
defines which class (fully qualified with namespace and all) actually implements your service(s).
Next, you either need to put those service implementations into a code-behind file of the *.svc (not recommended), or - much better - compile your WCF service implementation into a class library and stick that class library into the .\bin
directory under your virtual directory.
And in the end, you need appropriate config in your server-side web.config - from what I can tell, you already have that in place, and I think it should be just fine.
Your service addresses will be determined by the
and any additional settings you might have in your config for the individual service endpoints.
So in your case, you'd have
http://yourserver:port/YourVirtualDirectory/YourService.svc/restxml
http://yourserver:port/YourVirtualDirectory/YourService.svc/restjson
http://yourserver:port/YourVirtualDirectory/YourService.svc/soap
for your real functions, and a * http://yourserver:port/YourVirtualDirectory/YourService.svc/mex
for the metadata exchange (which you won't use directly).
Upvotes: 3