WCF回调契约如何进行正确定义
创始人
2024-06-23 22:41:24
0

WCF作为一款功能强大的.NET Framework 3.5的重要组成部件,它的出现为开发人员带来了非常大的好处。今天就先为大家讲解一下WCF回调契约的相关定义方式。一个服务契约最多只能包含一个WCF回调契约。通过ServiceContract特性,可以指定回调契约:

  1. interface ISomeCallbackContract   
  2. {   
  3. [OperationContract] void OnCallback( );   
  4. }   
  5. [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]   
  6. interface IMyContract {   
  7. [OperationContract] intDoSomething( );   
  8. }  

WCF回调契约无须标记ServiceContract特性,但是在回调契约中必须为服务的操作标记OperationContract特性。

在导入回调契约的元数据中,回调契约以Callback结尾。为简便起见,我们在定义回调契约时,***以Callback为后缀。

为了托管一个回调对象,客户端需要实例化回调对象,然后通过它创建一个上下文对象:

  1. class MyCallback : IMyContractCallback {   
  2. public void OnCallback( )   
  3. {...}   
  4. }   
  5. IMyContractCallback callback = new MyCallback( );   
  6. InstanceContext context = new InstanceContext(callback);  

假定客户端的代理类为MyContractClient,则在客户端就可以通过上下文对象获得代理对象:

  1. MyContractClient proxy = new MyContractClient(context);  

注意,如果使用了WCF回调契约,则客户端生成的代理类必须继承自DuplexClientBase代理类,这是一个专门的支持双向通信的代理类。注意,该类的构造函数参数既可以接收InstanceContext类型的上下文对象,也可以接收object类型的回调契约对象。

然而,如果是通过SvcUtil或Visual Studio 2005生成的代理,却不能使用接收object类型对象的构造函数,若要创建代理对象,我们必须先创建上下文对象,如前面的代码所示。

我们可以手动修改代理类,添加对它的支持,如下所示:

  1. partial class MyContractClient : DuplexClientBase
    ,IMyContract   
  2. {   
  3. public MyContractClient(object callbackInstance) : 
    base(callbackInstance) {} //More constructors   
  4. public void DoSomething( ) { Channel.DoSomething( );   
  5. }  
  6. }   
  7. class MyClient : IMyContractCallback,IDisposable   
  8. {   
  9. MyContractClient m_Proxy;   
  10. public void CallService( )   
  11. {   
  12. m_Proxy = new MyContractClient(this);  
  13.  m_Proxy.DoSomething( );   
  14. }  
  15.  public void OnCallback( )   
  16. {...}   
  17. public void Dispose( )   
  18. {   
  19. m_Proxy.Close( );   
  20. }   
  21. }  

注意,上述的代码中直接由客户端实现了回调契约,这是一种比较常见的实现方式。

客户端通过回调传递给服务端的消息包含了WCF回调契约终结点的引用。在服务端,可以通过OperationContext类的泛型方法GetCallbackChannel()获得。如下所示:

  1. ISomeCallbackContract callback = OperationContext.Current. 
    GetCallbackChannel( ); 

【编辑推荐】

  1. WCF单向操作不同于异步操作
  2. WCF服务引用具体操作步骤图解
  3. WCF行为扩展为程序开发提供极大便利
  4. WCF编码器正确创建方式解读
  5. WCF服务异步调用不同实现方式讲解

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...