原文:http://www.rainsts.net/article.asp?id=428

 

客户端和服务之间通过消息交换(Message Exchange)来完成方法调用和数据传递,WCF 定义了 3 种消息交换模式。

 

1. Request/Reply

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

 

Public Class Service1
    
Implements IService1

    
Public Sub Run() Implements IService1.Run
        Threading.Thread.Sleep(
4000'停四秒
    End Sub
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()

 

运行结果

 

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

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

相差了四秒了。

2.one-way模式

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

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

 

End Interface

 

我们来看一下运行结果:

 

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

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

马上就返回了结果

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

3. duplex

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

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

 

End Interface

 

   设置回调接口类型。由于回调方法在客户端执行,因此无须加ServiceContractAttribute属性。对于回调操作,服务器无须获取返回消息,因此添加isOneWay:=True特性参数。
End Interface
    实现服务契约,通过OperationContext.Current.GetCallBackChannel可以获取回调委托,进而完成调用。
End Class
这时运行时,会出现以前异常:
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 DateImplements 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

 

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

相关文章:

  • 2021-05-24
  • 2022-12-23
  • 2021-09-02
  • 2021-11-02
  • 2022-12-23
  • 2021-07-10
  • 2021-07-27
  • 2022-01-04
猜你喜欢
  • 2021-07-13
  • 2021-06-03
  • 2021-12-20
  • 2021-04-20
相关资源
相似解决方案