三种WCF消息交换常见模式解读
创始人
2024-06-16 17:20:19
0

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 

 

 

客户端调用

 

 

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

 

运行结果

 

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

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

相差了四秒了。

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

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

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

 

 

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

 

我们来看一下运行结果:

 

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

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

马上就返回了结果

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

WCF消息交换3. duplex

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

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

 

 

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

 

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

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

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

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

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

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

客户端实现:

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

小结:  

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

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...