Multiple Service Contracts in WCF Service

No.of Views1968
Bookmarked0 times
Downloads 
Votes0
By  Dhananjay Kumar   On  11 Jun 2010 10:06:36
Tag : WCF , General
In this article, I will show you, how we can have multiple contracts in WCF service.
emailbookmarkadd commentsprint

Images in this article missing? We recently lost them in a site migration. We're working to restore these as you read this. Should you need an image in an emergency, please contact us at info@codegain.com

 

Objective

In this article, I will show you, how we can have multiple contracts in WCF service.

Block Diagram

Image Loading

Above block diagram says
1.    There are three contracts.
2.    All contracts are being implemented in same service class.
3.    Each contract is exposed on different end points.
To start with follow the below steps,

Step 1

Create a WCF Service Application.

Step 2

Already by default IService1 contract is being added. Add two more contracts. Right click on the project and select add new item and then choose Interface from Code tab.
For my purpose, I am adding two more contracts called IMyContract1 and IMyContract2.  So now there are three service contracts in my service.  They are

1.    IService1
2.    IMyContract1
3.    IMyContract2

IService1

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace MultipleEndpoints
{[ServiceContract]public interface IService1{[OperationContract]string GetMessagefromIService1();}}

IMyContract1

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel; 

namespace MultipleEndpoints
{[ServiceContract]publicinterface IMyContract1{[OperationContract ]string GetMessagefromIMyContract1();}}

IMyContract2

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace MultipleEndpoints
{[ServiceContract]publicinterface IMyContract2{[OperationContract]string GetMessagefromIMyContract2();}}

Step 3

Implement the contracts in same service class Service1.svc. All  the function is just returning a simple string.

Service1.svc.cs

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace MultipleEndpoints
{public class Service1 : IService1, IMyContract1, IMyContract2{public string GetMessagefromIService1(){return "Calling Default Contract IService1";}public string GetMessagefromIMyContract1(){return "Calling My Contract IMyContract1";}public string GetMessagefromIMyContract2(){return "Calling My Contract IMyContract2";}}}

 Step 4 

Now we need to configure the end points for the different contracts.  Just modify System.ServiceModel node in configuration file (Web.Config) as below 

Image Loading

If you see the above end points configuration, different contracts has been exposed on different endpoints.  Address of the end points is given as relative to base address. And each end point contains a unique name also.  Address is unique for each end point.

Web.Config

 

<?xml version="1.0"?><configuration><system.web><compilation debug="true" targetFramework="4.0" /></system.web><system.serviceModel><behaviors><serviceBehaviors><behavior name ="Mg"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="false"/></behavior></serviceBehaviors></behaviors><services ><service name ="MultipleEndpoints.Service1"behaviorConfiguration ="Mg"><endpointname="firstBinding"address ="/firstContract"binding ="basicHttpBinding"contract ="MultipleEndpoints.IService1" /><endpoint name="secondBinding"address ="/secondContract"binding ="basicHttpBinding"contract ="MultipleEndpoints.IMyContract1"/><endpoint name="thirdBinding"address ="/thirdContract"binding ="basicHttpBinding"contract ="MultipleEndpoints.IMyContract2"/><endpoint contract="IMetadataExchange"binding="mexHttpBinding"address="mex" /><host><baseAddresses ><add baseAddress ="http://localhost:8180/Service1.svc"/></baseAddresses></host></service ></services></system.serviceModel><system.webServer><modules runAllManagedModulesForAllRequests="true"/></system.webServer></configuration>

 

Step 5

Press F5 to run the service.  Once service is up and running, we are ready to consume the service in client.

Step 6

Create a Console application as client. Add the service reference of the service.  Now you can see, there are three proxy classes have been generated by WCF. Each class is corresponding to each service contracts exposed by the service through the end points. 

Image Loading

You can see three service contracts have been exposed to the clients. 

Image Loading

Above block diagram says the all that, each contract is exposed on different end points.  And WCF created corresponding class for each contracts.

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using ConsoleApplication1.ServiceReference1; 


namespace ConsoleApplication1
{class Program
    {static void Main(string[] args)
        {

            Service1Client p = new Service1Client("firstBinding");
            MyContract1Client q = new MyContract1Client("secondBinding");
            MyContract2Client r = new MyContract2Client("thirdBinding");
            Console.WriteLine(p.GetMessagefromIService1());
            Console.WriteLine(q.GetMessagefromIMyContract1());
            Console.WriteLine(r.GetMessagefromIMyContract2());
            Console.Read();
              

        }
    }
}

 When you run, you will get output as 

Image Loading

Thanks for reading. I hope article was useful. Happy  Coding.

 
Sign Up to vote for this article
 
About Author
 
Dhananjay Kumar
Occupation-Software Engineer
Company-Infosys Technolgies,Pune
Member Type-Gold
Location-India
Joined date-20 Jul 2009
Home Page-http://dhananjaykumar.net/
Blog Page-http://dhananjaykumar.net/
Dhananjay Kumar is Microsoft MVP on connected system. He blogs at http://dhananjaykumar.net/ . You can follow him http://twitter.com/debugmode_/ and reach him at dhananjay.25july@gmail.com
 
 
Other popularSectionarticles
    This article is part # 2 of Instance Management in WCF. This article will explain Session Full Instance management service. This will explain different Session Mode at Contract level. This will explain Per-session service also. This article will be explaining Session Full Service with a code also.
    Published Date : 02/Aug/2010
    This is first part of multi series articles. This article is giving introduction of Instance Management. This article will explain about Per-Call Instance management technique as well.
    Published Date : 30/Jul/2010
    CRUD Operations on Windows Azure table and Azure Storage
    Published Date : 16/Feb/2010
    Dynamic Service and End Point Discovery feature of WCF 4.0
    Published Date : 16/Feb/2010
    This article will discuss about One Way Operations in WCF. I am also going to explain One Way Operation with Session full service pros and cons.
    Published Date : 16/Feb/2010
Comments
By:Sanjay JainDate Of Posted:9/19/2011 12:55:29 PM
Multiple Service Contracts in WCF Service
But how do we create the proxy file only for one contract while leaving the other one.
By:PrateekDate Of Posted:1/21/2011 12:19:58 AM
Restrict client application to cosume only one endpoint
Hi I am really impressed by your WCF articles. I have tried code explained by you. i want to ask you 2 question that how to restrict client application to consume service through only one endpoint? and second one is though i provide baseaddress in web.config but still it runs on random port in iis. Thanks in advance.
Leave a Reply
Title:
Display Name:
Email:
(not display in page for the security purphase)
Website:
Message:
Please refresh your screen using Ctrl+F5
If you can't read this number refresh your screen
Please input the anti-spam code that you can read in the image.
^ Scroll to Top