三种WCF消息交换常见模式解读

开发 开发工具
WCF消息交换分为三种模式,分别为:Request/Reply;one-way模式和duplex。我们在这篇文章中将会重点介绍这三种消息交换模式。

WCF刚刚开始学的时候会觉得比较难以掌握,其实我们可以通过在实践中慢慢去体会那些难以掌握的知识点。当我们在实际使用中,会发现WCF消息交换总共有三种模式。#t#

 

WCF消息交换1. Request/Reply

这是缺省模式,又称为同步调用。在调用服务方法后需要要等待服务消息的返回。

 

 

  1. Public Class Service1  
  2. Implements IService1  
  3. Public Sub Run() Implements 
    IService1.Run  
  4. Threading.Thread.Sleep(4000) '停四秒  
  5. End Sub  
  6. End Class 

 

 

客户端调用

 

 

Dim s As New ServiceReference1
.Service1Client  
s.Open()   Console.WriteLine("开始执行时间: 
{0}", Now.ToString)  
s.Run()   Console.WriteLine("结束执行时间:
{0}", Now.ToString)  
s.Close()   Console.ReadKey() 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

 

运行结果

 

开始执行时间: 2009-11-06 16:53:51

结束执行时间:2009-11-06 16:53:55

相差了四秒了。

WCF消息交换2.one-way模式

这种方式在调用方法后会立即返回,非常类似于异步行为。不过需要注意的是one-way只能用在过程方法是,而不用于函数。

接口定义如下,实现不用更改

 

 

< ServiceContract()> _  
Public Interface IService1  
< OperationContract
(isoneway:=True)> _   Sub Run()   End Interface 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

 

我们来看一下运行结果:

 

开始执行时间: 2009-11-06 16:58:28

结束执行时间:2009-11-06 16:58:28

马上就返回了结果

注意使用此模式,不得声明输出参数、引用参数或返回值。

WCF消息交换3. duplex

这种模式相对复杂一些,我们详细描述一下步骤:

(1).设计标准的服务契约。为了完成回调操作,我们必须指定SessionMode和回调类型

 

 

< ServiceContract(SessionMode
SessionMode:=SessionMode.Required, 
callbackcontract:=GetType(ICallback))> _  
Public Interface IService1   < OperationContract(isoneway:=True)> _   Sub Run(ByVal name As String)   End Interface 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

 

设置回调接口类型。由于回调方法在客户端执行,因此无须加ServiceContractAttribute属性。对于回调操作,服务器无须获取返回消息,因此添加isOneWay:=True特性参数。

Public Interface ICallback  
< OperationContract()> _  
Sub [Call](ByVal t As DateTime)  
End Interface  
实现服务契约,通过OperationContext
.Current.GetCallBackChannel
可以获取回调委托,进而完成调用。  
Code   Public Class Service1   Implements IService1   'ICallback callback = OperationContext
.Current.GetCallbackChannel< ICallback>();   Dim callback As ICallback = 
OperationContext.Current.
GetCallbackChannel(Of ICallback)()  
Public Sub Run(ByVal name As 
String) Implements IService1.Run  
Threading.Thread.Sleep(1000) '停四秒   Me.callback.Call(Now)   Console.WriteLine("Run Time 
" & Now.ToString)  
End Sub   End Class 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

这时运行时,会出现以前异常:

System.InvalidOperationException: 协定需要双工,但是绑定“WSHttpBinding”不支持它或者因配置不正确而无法支持它。

需要更改服务器的配置文件:

< endpoint address ="" binding="wsHttpBinding" contract="异步.IService1">中的wsHttpBinding改为wsDualHttpBinding,客户端重新更新服务器引用即可

客户端实现:

Sub Main()  
Dim s As New ServiceReference1
.Service1Client(New System.
ServiceModel.InstanceContext
(New ContractCallback))  
Console.WriteLine("开始执行时间: 
{0}", Now.ToString)  
s.Run("aa")   Console.WriteLine("结束执行时间:
{0}", Now.ToString)  
Console.ReadKey()   End Sub   Public Class ContractCallback   Implements ServiceReference1.
IService1Callback  
Public Sub [Call](ByVal t As Date) 
Implements ServiceReference1
.IService1Callback.Call  
IO.File.Delete("c:\1.xml")   Console.WriteLine("Call AppDomain:" 
& AppDomain.CurrentDomain.FriendlyName)  
Console.WriteLine("Server DateTime:" 
& t.ToString)  
End Sub   End Class 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

小结:  

运行没有问题,但是 Call 方法,并没有进行打印,也没有删除C盘下面的1.xml文件。百思不得其解,同时反现不知道怎么调试服务端。这次虽然按照网上博客实现了三种WCF消息交换的方式,但是没有理解其中的奥秘。

责任编辑:曹凯 来源: 博客园
相关推荐

2009-11-06 13:23:27

WCF模式

2010-08-03 10:59:29

云计算三种服务模式

2010-03-01 15:21:57

WCF死锁

2010-01-18 14:20:15

交换机接口类型

2011-11-28 13:03:29

网络热备网络设备热备设备热备

2009-11-06 10:54:19

WCF服务方式

2017-12-29 08:26:28

存储引擎MySQL

2009-08-04 09:09:56

Java常见异常

2009-11-10 13:19:09

动态路由协议

2021-08-10 10:14:14

存储接口存储设备存储

2015-09-14 09:31:44

结对设计

2015-10-13 15:05:09

BYOD自带设备移动办公

2015-09-25 11:08:44

移动办公BYOD

2010-01-06 15:46:30

华为交换机vlan

2011-06-17 10:30:36

2010-02-03 15:46:15

C++函数传递

2009-12-22 13:34:07

WCF性能计数器级别

2010-09-25 15:07:08

SQL插入语句

2010-08-24 09:43:33

2022-05-27 11:33:02

前端代码设计模式
点赞
收藏

51CTO技术栈公众号