.NET Tutorials, Forums, Interview Questions And Answers
Welcome :Guest
 
Sign In
Register
 
Win Surprise Gifts!!!
Congratulations!!!



Home >> Articles >> WCF >> Post New Resource Bookmark and Share   

 Subscribe to Articles

Duplex Service in WCF Step By Step Tutorial

Posted By:Dhananjay Kumar       Posted Date: September 07, 2010    Points: 25    Category: WCF    URL: http://www.dhananjaykumar.net  

Duplex Service in WCF Tutorial. This Tutorial will give step by step explanation on how to create a simple duplex service in WCF.
 

Objective

This article will give step by step explanation on how to create a simple duplex service in WCF.

In call back operation or duplex service, Service can also call some function at the client .

Duplex1.gif

  1. Duplex service allows calling back some operation (function) on the client.
     
  2. Duplex service also knows as Call Backs. 
     
  3. All Binding does not support duplex service. 
     
  4. Duplex communication is not standard. They are absolute Microsoft feature. 
     
  5. wsDualHttpBinding supports duplex communication over HTTP binding. 
     
  6. Duplex communication is possible over netTcpBinding and netNamedPipeBinding
Steps involved in creating a duplex service
  1. Create a WCF Service
     
  2. Create a call back contract. 
     
  3. Create service contract 
     
  4. Implement service and configure the behavior for duplex communication and call the client function at the service. 
     
  5. Configure the endpoint for duplex service 
     
  6. Create the client. 
     
  7. Call the WCF Service
Create a WCF Service
  1. Open visual studio and create a new project. Select WCF Service application from WCF project template tab.
     
  2. Delete all the default generated code. 
     
  3. If using VS2010, open web.config and comment serviceHostEnvironment as below. 

    Duplex2.gif
     
  4. If using VS2008 then delete the default End Point generated. 
     
  5. Now you are left with empty IService1 and Service1.svc.cs file.
Create a call back contract
  1. Open IService1.cs.
     
  2. Add an interface in the same file. Give any name of the interface. I am giving name here IMyContractCallBack 

    Duplex3.gif
     
  3. Create an operation contract in the Interface.
     
  4. Make sure return type is Void. 
     
  5. Make sure IsOneWayProperty is set to true. 
     
  6. There is no need to mark call back interface as ServiceContract.
Explanation

At the client side, this call back interface will get implemented and on a duplex channel Service will call the CallBackFunction from the client.

Create service contract
  1. Open IService1.
     
  2. Declare operation contract called from the client. Make the isoneway to property to true from the service operation contract also. 

    Duplex4.gif
     
  3. Set the CallBackContract in Service contract attribute. Set the call back contract as the interface created for the call back.

    Duplex5.gif
Here IMyContractCallBack is name of the interface user for duplex communication.

So Service contract and call back contract will be as below,

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 WcfService3

{

   [ServiceContract(CallbackContract=typeof(IMyContractCallBack))]

   public interface IService1

   {

       [OperationContract(IsOneWay=true)]

       void  NormalFunction();

   } 

   public interface IMyContractCallBack

   {

       [OperationContract(IsOneWay=true)]

       void  CallBackFunction(string str);

   }

} 
Implement service and configure for duplex communication and call client function
  1. In service behavior set the instance mode of the service to percall.

    Duplex6.gif
     
  2. Create a call back channel

    Duplex7.gif

    Here I am using OperationConetxt to get current call back channel.
     
  3. Now instance of IMyContractCallBack can be used to make call at the function in call back interface contract at the client side. Like below ,

    Duplex8.gif
Here we are going to call function at the client side from the operation contract of the service.

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 WcfService3

{  

   [ServiceBehavior(InstanceContextMode= InstanceContextMode.PerCall)]

   public class Service1 : IService1

   {  

       public void  NormalFunction()

       {

           IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel();      

           callback.CallBackFunction("Calling from Call Back");

       }

   }

}

Configure the endpoint for duplex service

As we discussed earlier that duplex service is not supported by all type of bindings. So while configuring the end point for the service we need to choose the binding supports duplex communication. Here we are going to use wsDualHttpBinding
  1. Declare the end point with wsDualHttpBinding.

    Duplex9.gif
     
  2. Declare the Meta data exchange end point. 

    Duplex10.gif
     
  3. Declare the host address 

    Duplex11.gif
     
  4. Declare the service behavior

    Duplex12.gif
So the service in configuration will look like

Duplex13.gif

Web.Config




 

   

 

 

   

     

               

                 

         

       

     

   

   

   

     

       

         

           

         

       

       

       

     

   

 

 

   

  

 
Create the client
  1. Create a console application to consume this service.
     
  2. Add the reference of System.ServiceModel. In console application project. 
     
  3. Add the service reference of the service, we created in previous steps.
Create a duplex proxy class to implement call back contract
  1. Right click and add a class in console application. Give any name; I am giving the name MyCallBack.
     
  2. Add the namespace 

    Duplex14.gif
     
  3. Implement call back contract. In our case it is IService1Callbackand IDisposable.

    Duplex15.gif

    Note: Since name of the service contract is IService1, so the call back interface name will be IService1Callback . It is name of service contract suffixes by keyword CallBack.
     
  4. Now implement the call back contract method in this class. 

    Duplex16.gif
     
  5. Now make a function in this class to create duplex proxy.

    a. Create an instance of InstanceContext and pass the reference of current class in the constructor of that.

    Duplex17.gif

    b. Pass this context as parameter of service1client

    Duplex18.gif

    c. Call the service on this proxy

    Duplex18.1.gif
So, the function will be

Duplex19.gif


For your reference MyCallback class will be as below,

MyCallback.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ConsoleApplication1.ServiceReference1;

using System.ServiceModel;


namespace ConsoleApplication1

{

   class MyCallBack :IService1Callback ,IDisposable

   {

       Service1Client proxy;    

       public void  CallBackFunction(string str)

       {

           Console.WriteLine(str);

       }

       public void callService()

       {

         InstanceContext context = new InstanceContext(this);

          proxy = new Service1Client(context);

          proxy.NormalFunction();

       }

       public void Dispose()

       {

           proxy.Close();

       }

   }

} 
Call the WCF Service

Create the instance of MyCallBack class and call the callService() method to call the service.

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ConsoleApplication1.ServiceReference1;

using System.ServiceModel;


namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           MyCallBack obj = new MyCallBack();

           obj.callService();

           Console.Read();

           obj.Dispose();

       }

   }

}

Output


Duplex20.gif

 Subscribe to Articles

     

Further Readings:

Responses
Author: bindu         Company URL: http://www.dotnetspark.com
Posted Date: September 08, 2010

hii........
article is well explained but iam getting an error.

IService1CallBack does not exist...r u missing reference or library...
if i add an empty class/interface to clear this error, applications is running but with an exception.

Unhandled Exception: System.InvalidOperationException: The InstanceContext provi
ded to the ChannelFactory contains a UserObject that does not implement the Call
backContractType 'MyCallBackWCFClient.ServiceReference1.IService1Callback'.
at System.ServiceModel.DuplexChannelFactory`1.CreateChannel(InstanceContext c
allbackInstance, EndpointAddress address, Uri via)
at System.ServiceModel.DuplexChannelFactory`1.CreateChannel(EndpointAddress a
ddress, Uri via)
at System.ServiceModel.ChannelFactory`1.CreateChannel()
at System.ServiceModel.DuplexClientBase`1.CreateChannel()
at System.ServiceModel.ClientBase`1.CreateChannelInternal()
at System.ServiceModel.ClientBase`1.get_Channel()
at MyCallBackWCFClient.ServiceReference1.Service1Client.NormalFunction() in c
:\users\bramachandruni\documents\visual studio 2010\Projects\MyCallBackWCFClient
\MyCallBackWCFClient\Service References\ServiceReference1\Reference.cs:line 58
at MyCallBackWCFClient.MyCallBack.callService() in c:\users\bramachandruni\do
cuments\visual studio 2010\Projects\MyCallBackWCFClient\MyCallBackWCFClient\MyCa
llBack.cs:line 22
at MyCallBackWCFClient.Program.Main(String[] args) in c:\users\bramachandruni
\documents\visual studio 2010\Projects\MyCallBackWCFClient\MyCallBackWCFClient\P
rogram.cs:line 13
Press any key to continue . . .

please help
regards
bindu
Author: bindu         Company URL: http://www.dotnetspark.com
Posted Date: September 08, 2010

hiii
i have got one more doubt
to post the above comment, i had to login from mozilla. i read the article from IE.
From IE, i couldn't post the comment due to error.
may i knmow why does this type of error occur?

regards
bindu

Post Comment

You must Sign In To post reply
Find More Articles on C#, ASP.Net, Vb.Net, SQL Server and more Here

Hall of Fame    Twitter   Terms of Service    Privacy Policy    Contact Us    Archives   Tell A Friend