• 1. WCF 消息交换


    原文: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只能用在过程方法是,而不用于函数。

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

    Code
    <ServiceContract()> _
    Public Interface IService1

        
    <OperationContract(isoneway:=True)> _
        
    Sub Run()

    End Interface

    我们来看一下运行结果:

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

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

    马上就返回了结果

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

    3. duplex

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

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


    <ServiceContract(SessionMode:=SessionMode.Required, callbackcontract:=GetType(ICallback))> _
    Public Interface IService1

        
    <OperationContract(isoneway:=True)> _
        
    Sub Run(ByVal name As String)

    End Interface
       设置回调接口类型。由于回调方法在客户端执行,因此无须加ServiceContractAttribute属性。对于回调操作,服务器无须获取返回消息,因此添加isOneWay:=True特性参数。
    Codeba
    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 StringImplements IService1.Run
            Threading.Thread.Sleep(
    1000'停四秒

            
    Me.callback.Call(Now)

            Console.WriteLine(
    "Run Time " & Now.ToString)

        
    End Sub

    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文件。百思不得其解,同时反现不知道怎么调试服务端。这次虽然按照网上博客实现了三种消息传递的方式,但是没有理解其中的奥秘。
  • 相关阅读:
    枚举EnumHelper
    日期相关转化 TimeHelper
    C# 环境变量设置
    PDF 文件操作 PdfHelper
    32位系统支持多大内存?
    我们对待西洋近代文明的态度
    深度剖析CPython解释器》Python内存管理深度剖析Python内存管理架构、内存池的实现原理
    Element2.15.6 版本 Carousel 走马灯,当循环项长度为2时,循环动画的运行方向不能始终一致的问题处理
    python globals()[]将字符串转化类,并通过反射执行方法
    Pycharm import faker 和 colorlog提示“No module name faker/colorlog”
  • 原文地址:https://www.cnblogs.com/zqonline/p/1597585.html
Copyright © 2020-2023  润新知