Multiple Service Contracts in WCF Service

Objective

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

Block Diagram

clip_image002

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

IMyContract1

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

namespace MultipleEndpoints

{

[ServiceContract]

public interface IMyContract1

{

[OperationContract ]

string GetMessagefromIMyContract1();

}

}

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();

}

}

IMyContract2

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

namespace MultipleEndpoints

{

[ServiceContract]

public interface 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″;

}

}

}


Step4

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

clip_image003

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>

<endpoint name=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.

clip_image004

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

clip_image006

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

clip_image008

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

Configuring Multiple End points for WCF Service

Objective

In this article, I will explain how we could configure multiple binding for WCF service.

To see the video tutorial of hosting WCF Service in Console Application Click Here

i1

While creating multiple endpoints for the service, make sure each end point is having unique address. If address is not unique, you will catch with run time error.

i3

Mathematically, we can say

i2

Scenario for Multiple End Points

1. Service wants to expose more than one type of binding.

2. Service wants to expose more than one contract on the same binding.

3. Service wants to expose same binding and contract on different addresses.

Multiple End Points could be configuring in Web.Config file.

i4

Sample Service with multiple End Points

Step 1

Create a WCF Service Application. Open Visual studio and create new project selecting WCF Service Application project template. In VS2008, you will get WCF Service Application project template inside WEB tab whereas in VS2010, you will get WCF Service Application project template inside WCF tab.

Step 2

Delete the default code getting created for you by WCF. Delete all the code from IService1 and Service1. If you are using VS2008, comment out whole System.ServiceModel from Web.Config file. And if you are using VS2010 then comment out Multiple Host Binding.

Step 3

Contract is as below

clip_image007

Service implementation is

clip_image009

Step 4

To see the video tutorial of hosting WCF Service in Console Application Click Here

Create a console application to host the service.

For this,

1. Right click and add new project to your solution of Console type.

2. Add Reference of System.ServiceModel.

3. Add project reference of WCF Service Application created in Step 1.

4. Make this Console application as your startup project. To make this right click on console application and select make as startup project.

5. Right click on the console application then select add new item and then add new Application Configuration File.

clip_image011

Step 5

Configure the multiple end points here.

1. Add as many end points as you want in service tag.

2. Make sure none of the end points is having same address. Else you will get run time error.

3. Advisable is to use relative address. So for that add base address using Host tag.

So configuration file with multiple end points can look like,

clip_image013

Explanation

1. There are two end points getting exposed.

2. Relative address is being used to expose the end points.

3. Two end points are having their respective names as firstBinding and secondBinding.

Press F5 to run the host (Console) application.

clip_image015

Keep open this console running window. Do not close this window.

Step 6

Create a Console client. To do, open visual studio and create a new console application. Add Service Reference. Copy the base address from app.config of host console application (created in Step 5) and paste as Service URL.

clip_image017

You can see in above code, we are creating proxy twice by passing end point names respectively. If you want, you can pass address of respective endpoint also along with name of the end point.

clip_image019

When you press F5, you will get below output.

clip_image021

For your Reference full source code is given below,

WCF Service Application

Contract (IService1.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

{

[ServiceContract]

public interface IService1

{

[OperationContract]

string GreetingMessage(string Name);

}

}

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

{

public string GreetingMessage(string name)

{

return “You are Called From “ + name;

}

}

}

Hosting Console Application

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using MultipleEndpoints;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

ServiceHost host = new ServiceHost(typeof(Service1));

host.Open();

Console.WriteLine(“Service is up and running”);

Console.WriteLine(“To Close Service Press any Key “);

Console.ReadKey();

host.Close();

}

}

}

App.Config

<?xml version=1.0 encoding=utf-8 ?>

<configuration>

<system.serviceModel>

<behaviors>

<serviceBehaviors>

<behavior name =Mg>

<serviceMetadata httpGetEnabled=true/>

<serviceDebug includeExceptionDetailInFaults=false/>

</behavior>

</serviceBehaviors>

</behaviors>

<services >

<service name =MultipleEndpoints.Service1

behaviorConfiguration =Mg>

<endpoint name=firstBinding

address =/MyFirstBindingAddress

binding =basicHttpBinding

contract =MultipleEndpoints.IService1 />

<endpoint name=secondBinding

address =/MySecondBindingAddress

binding =basicHttpBinding

contract =MultipleEndpoints.IService1/>

<endpoint contract=IMetadataExchange

binding=mexHttpBinding

address=mex />

<host>

<baseAddresses >

<add baseAddress =http://localhost:8181/Service1.svc/>

</baseAddresses>

</host>

</service >

</services>

</system.serviceModel>

</configuration>

Client Console application

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ConsoleApplication2.ServiceReference1;

namespace ConsoleApplication2

{

class Program

{

static void Main(string[] args)

{

Service1Client proxy1 = null;

proxy1 = new Service1Client(“firstBinding”);

Console.WriteLine(proxy1.GreetingMessage(“First End Point”));

proxy1 = new Service1Client(“secondBinding”);

Console.WriteLine(proxy1.GreetingMessage(“Second End Point”));

Service1Client proxy = null;

proxy = new Service1Client(“firstBinding”,

http://localhost:8181/Service1.svc/MyFirstBindingAddress&#8221;);

Console.WriteLine(proxy.GreetingMessage(“First End Point calling with Address”));

proxy = new Service1Client(“secondBinding”,

http://localhost:8181/Service1.svc/MySecondBindingAddress&#8221;);

Console.WriteLine(proxy.GreetingMessage(“Second End Point Calling with Address”));

Console.ReadLine();

}

}

}

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