WCF回调操作是鸡应用技巧讲解

开发 开发工具
我们今天将会在这篇文章中为大家详细介绍一下有关WCF回调操作的一些必要条件,以及相关操作方法,希望能给大家带来些帮助。

WCF开发插件对于开发人员来说是一个比较重要的应用工具,可以帮助我们轻松的实现一些特定的功能需求。在这里我们就一起来分享一下有关WCF回调操作的相关操作技巧。WCF回调操作简单的说就是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。#t#

WCF回调的必要条件:

1、并不是所有的绑定都支持回调操作,只有具有双向通信能力的绑定才可以使用回调。比如HTTP是与连接无关的因此不能用于回调。这就说明我们不能使用BasicHttpBinding或WSHttpBinding进行回调。WCF中NetTcpBinding和 NetNamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualHttpBinding也是支持回调的因为它实际上是设置了两个HTTP通道

定义回调契约

一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持这个WCF回调操作。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,代码如下:

 

  1. [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]  
  2. public interface IService1  
  3. {  
  4. [OperationContract(IsOneWay=true)]  
  5. void DoSomething();  
  6. }  
  7. //用于回调的契约  
  8. interface ISomeCallbackContract  
  9. {  
  10. [OperationContract(IsOneWay=true)]  
  11. void SomeCallbackMethod();  
  12. [OperationContract(IsOneWay = true)]  
  13. void SomeCallbackMethod2();  

客户端WCF回调操作设置

客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象InstanceContext。然后用代理把这个回调的引用传回服务端

下面通过代码实例说明:

服务端代码:

 

  1. [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]  
  2. public interface IService1  
  3. {  
  4. [OperationContract(IsOneWay=true)]  
  5. void DoSomething();  
  6. }  
  7. //用于回调的契约  
  8. interface ISomeCallbackContract  
  9. {  
  10. [OperationContract(IsOneWay=true)]  
  11. void SomeCallbackMethod();  
  12. [OperationContract(IsOneWay = true)]  
  13. void SomeCallbackMethod2();  

实现服务的类:

 

  1. [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Reentrant)]  
  2. public class Service1 : IService1  
  3. {  
  4. static List<ISomeCallbackContract> m_Callbacks = new 
    List
    <ISomeCallbackContract>();  
  5. public void DoSomething()  
  6. {  
  7. //获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法  
  8. ISomeCallbackContract callback = OperationContext.Current.
    GetCallbackChannel
    <ISomeCallbackContract>();  
  9. if (m_Callbacks.Contains(callback) == false)  
  10. {  
  11. m_Callbacks.Add(callback);  
  12. }  
  13. Trace.WriteLine("DoSomething");  
  14. //调用客户端实现的SomeCallbackMethod2方法,  
  15. callback.SomeCallbackMethod2();  
  16. CallClients();  
  17. }  
  18. static public void CallClients()  
  19. {  
  20. Action<ISomeCallbackContract> invoke = 
    delegate(ISomeCallbackContract callback)  
  21. {  
  22. callback.SomeCallbackMethod();  
  23. };  
  24. m_Callbacks.ForEach(invoke);  
  25. }  

客户端代码:

 

  1. //客户端实现回调接口,使用VS自动生成代理的时候,对于回调接口的命名默认是
    以服务契约接口名称+Callback,而不是原先在服务端定义的回调接口的名子  
  2. public class CallBack : ServiceReferenceCallBack.IService1Callback  
  3. {  
  4. public void SomeCallbackMethod()  
  5. {  
  6. MessageBox.Show("SomeCallbackMethod()", "MyClient");  
  7. }  
  8. public void SomeCallbackMethod2()  
  9. {  
  10. MessageBox.Show("SomeCallbackMethod2()", "MyClient");  
  11. }  

客户端调用

首先生成回调接口实现的对象,然后用这个对象去实例化一个上下文对象context ,在创建客户端代理对象的时候在构造方法中使用这个上下文对象context 就可以把客户端回调对象的引用作为消息的一部分传送到服务端,在服务端就可以通过 OperationContext.Current.GetCallbackChannel<ISomeCallbackContract> ()来获得这个回调对象的引用,服务端有了这个回调对象的引用就可以去调用客户端实现的WCF回调操作方法。

 

  1. ServiceReferenceCallBack.IService1Callback callback = new CallBack();  
  2. InstanceContext context = new InstanceContext(callback);  
  3. ServiceReferenceCallBack.Service1Client sc = new 
    WCFPrograme.ServiceReferenceCallBack.Service1Client(context);  
  4. sc.DoSomething(); 

 

责任编辑:曹凯 来源: 豆豆网
相关推荐

2009-12-22 19:00:08

WCF回调

2010-02-22 16:19:25

WCF自托管

2009-12-21 14:49:27

2010-02-23 14:17:20

WCF配置文件

2010-02-26 13:40:28

WCF消息头

2009-11-06 16:13:45

WCF回调

2010-02-23 09:44:12

WCF dataCon

2010-02-23 14:03:53

WCF契约回调

2010-02-23 10:57:34

WCF Streami

2009-12-22 19:14:36

WCF效率

2009-12-08 13:46:16

Silverlight

2009-12-08 15:52:10

WCF回调

2009-11-09 15:58:07

WCF回调方法

2010-02-22 11:25:50

WCF DateSet

2010-02-24 15:20:23

WCF Message

2010-02-24 13:48:44

MSMQ使用WCF

2009-08-19 17:10:09

C#回调函数

2010-03-01 15:12:53

WCF回调契约

2010-03-01 13:06:49

WCF继承

2010-02-22 16:26:47

WCF传输数据
点赞
收藏

51CTO技术栈公众号