• WCF双工通信笔记


    1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作

    2,客户端调用服务时,附加上一个回调对象(InstanceContext)。服务端处理服务请求时,通过该回调对象调用客户端操作。

    3,WCF系统设计常用四层结构:Contracts(契约),Services(服务),Hosting(服务寄宿),Clients(客户端)

    4,客户端调用服务,需要服务契约;服务端回调客户端操作,同样需要回调契约。回调契约通过ServiceContract(服务契约)特性的CallbackContract属性指定

    5,回调契约本质也是服务契约,但在服务契约里已指明该回调契约的服务契约属性,所以回调契约不需要再标记ServiceContract属性

    6,服务端在处理服务请求时,通过当前的OperationContext.Current.GetCallback<T>方法获取回调对象,T代表回调契约的类型

    7,OperationContext代表服务操作执行上下文,通过静态属性Current获取当前OperationContent。我们可以在服务端或客户端设置一些上下文,比如为出栈消息添加Soap报头,从入栈消息取出报头等

    8,为执行回调,客户端首先要实现回调契约:定义继承回调契约的类,实现回调契约接口方法

    9,调用双工服务,先创建回调对象,并通过InstanceContext对回调对象包装,然后用DuplexChannelFactory<TChannel>方法创建服务通道。

    10,用服务通道的CreateChannel方法生成服务代理对象,进而调用服务方法。

    11,服务响应请求,回调回调对象的方法,在客户端执行回调方法。

     契约定义:

    using System.ServiceModel;
    namespace Contracts
    {
        [ServiceContract(CallbackContract = typeof(ICallback))]
        public interface ICalculator
        {
            [OperationContract(IsOneWay =true)]
            void Add(double x,double y);
        }
    
        public interface ICallback
        {
            [OperationContract(IsOneWay = true)]
            void DisplayResult(double x, double y, double result);
        }
    }

    服务实现:

    using Contracts;
    namespace Services
    {
        public class CalculatorService : ICalculator
        {
            public void Add(double x, double y)
            {
                double result = x + y;
                ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
                callback.DisplayResult(x,y, result);
            }
        }
    }

    服务寄宿:

    using System;
    using System.ServiceModel;
    using Services;
    namespace Hosting
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
                {
                    host.Open();
                    Console.Read();
                }
            }
        }
    }

    寄宿配置:

      <system.serviceModel>
        <services>
          <service name="Services.CalculatorService">
            <endpoint address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/>
          </service>
        </services>
      </system.serviceModel>

    客户端调用及回调实现:

    using Contracts;
    using System;
    using System.ServiceModel;
    namespace Clients
    {
        class Program
        {
            static void Main(string[] args)
            {
                InstanceContext instanceContext = new InstanceContext(new CalculatorCallback());
                using (DuplexChannelFactory<ICalculator> ChannelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService"))
                {
                    ICalculator prox = ChannelFactory.CreateChannel();
                    using (prox as IDisposable)
                    {
                        prox.Add(1, 2);
                        Console.Read();
                    }
                }
            }
        }
        class CalculatorCallback : ICallback
        {
            public void DisplayResult(double x, double y, double result)
            {
                Console.WriteLine($"{x} + {y} = {result}");
            }
        }
    }

    客户端配置:

      <system.serviceModel>
        <client>
          <endpoint name ="CalculatorService" address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/>
        </client>
      </system.serviceModel>

    WCF Tcp双工通信 Get !

  • 相关阅读:
    关于我对区块链和比特币的看法
    叙Windows平台下基于MBR和UEFI的bootkit(一)--以MBR为例
    动若脱兔:深入浅出angr--初步理解符号执行以及angr架构
    面经
    倚天屠龙(一):妙用IDA Pro--利用IDAPython编写调试插件
    初生牛犊:Windows下Anti-sandboxes技术探究
    浮生半日:探究Python字节码
    抽丝剥茧:理解Android权限机制
    自古套路得人心:安全岗面经(人生苦短,请勿入坑二进制)
    点击按钮,复制微信号代码
  • 原文地址:https://www.cnblogs.com/TianPing/p/10056472.html
Copyright © 2020-2023  润新知