WCF回调契约如何进行正确定义

开发 开发工具
如果我们想在程序中对WCF回调契约进行定义,那么正确的操作方法应该是如何的呢?在这里将会针对这一问题进行详细讲解。

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<T>代理类,这是一个专门的支持双向通信的代理类。注意,该类的构造函数参数既可以接收InstanceContext类型的上下文对象,也可以接收object类型的回调契约对象。

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

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

  1. partial class MyContractClient : DuplexClientBase
    <IMyContract>,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<T>()获得。如下所示:

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

【编辑推荐】

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

2010-02-26 11:15:51

WCF接口方法

2010-02-24 14:41:16

WCF物理地址

2010-02-25 16:07:28

WCF REST

2010-02-23 14:03:53

WCF契约回调

2009-12-08 11:34:40

WCF Windows

2009-11-06 16:05:37

WCF回调契约

2010-02-24 15:27:26

Python数组

2010-01-18 17:07:52

C++类

2009-12-30 17:35:21

Silverlight

2009-12-21 14:05:18

WCF契约

2009-12-22 19:00:08

WCF回调

2010-02-22 13:56:35

WCF服务契约

2009-11-09 09:23:10

WCF数据契约

2010-02-22 15:27:05

WCF数据契约

2010-02-24 16:58:14

WCF Session

2012-03-26 10:55:03

JavaJava EE

2023-11-30 07:50:38

SaaS企业

2009-11-09 15:58:07

WCF回调方法

2009-12-08 15:52:10

WCF回调

2020-11-04 07:05:57

技术总监同事
点赞
收藏

51CTO技术栈公众号