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

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

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

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

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

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

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

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

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

MyContractClient proxy = new MyContractClient(context);  
  • 1.

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

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

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

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

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

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

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

【编辑推荐】

  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数组

2009-12-21 14:05:18

WCF契约

2010-01-18 17:07:52

C++类

2009-11-09 09:23:10

WCF数据契约

2010-02-24 16:58:14

WCF Session

2010-02-22 13:56:35

WCF服务契约

2010-02-22 15:27:05

WCF数据契约

2009-12-30 17:35:21

Silverlight

2009-12-22 19:00:08

WCF回调

2024-05-21 09:08:57

JVM调优面试

2023-11-30 07:50:38

SaaS企业

2009-12-22 11:29:27

WCF自定义集合类型

2010-03-02 10:54:42

WCF回调操作

2009-11-06 15:02:47

WCF契约查询
点赞
收藏

51CTO技术栈公众号