zoukankan      html  css  js  c++  java
  • WCF三种通信方式

    一、概述

      WCF在通信过程中有三种模式:请求与答复、单向、双工通信。以下我们一一介绍。

    二、请求与答复模式

      描述:

      客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序

     [OperationContract]
    string ShowName(string name);

    二、单向模式

      描述:

      客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。如下图所示:

    [OperationContract(IsOneWay = true)]
    void ShowName(string name);

        特点:使用 IsOneWay=true 标记的操作不得声明输出参数、引用参数或返回值

    三、双工模式

      描述:

      双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用:以往我们只是在客户端调用服务端,然后服务端有返回值返回客户端,而相互调用不光是客户端调用服务端,而且服务端也可以调用客户端的方法

    在上图中,客户端的程序A调用服务端的程序A,服务程序A执行完成前又调用客户端的程序D,然后再返回到程序A,图有点乱,其实就是为了说明“服务端”与“客户端”可以相互调用,下面直接看代码。

    支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用NetTcpBinding为例

    服务端实现方式:

        [ServiceContract(CallbackContract =typeof(IDongCallBack))]
        public interface IPuseService
        {
            [OperationContract]
            string DoWork(string name);
        }
       public class PuseService : IPuseService
        {
            public string DoWork(string name)
            {
                var callBack= OperationContext.Current.GetCallbackChannel<IDongCallBack>();
                callBack.GetName("双工"+ name);
                return "WCF服务";
            }
        }

    回调接口:

     public interface IDongCallBack
        {
            [OperationContract(IsOneWay =true)]
            void GetName(string name);
        }

    //配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="">
                        <serviceMetadata httpGetEnabled="false" 【有坑,必须改成false】   httpsGetEnabled="false" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service name="T_WCF.PuseService">
                    <endpoint address="" binding="netTcpBinding"【必须改】 contract="T_WCF.IPuseService">
                        <identity>
                            <dns value="localhost" />
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexTcpBinding"【必须改】 contract="IMetadataExchange" />
                    <host>
                        <baseAddresses>
                            <add baseAddress="【必须改】net.tcp://localhost:8733/Design_Time_Addresses/T_WCF/PuseService/" />
                        </baseAddresses>
                    </host>
                </service>
            </services>
        </system.serviceModel>
    </configuration>

    客户端实现方式:

    class Program
        {
            static void Main(string[] args)
            {
                InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
                PuseServiceClient client = new PuseServiceClient(instanceContext);
                var result = client.DoWork("wds");
                Console.WriteLine(result);
                Console.ReadKey();
            }
        }
    
    class CallbackHandler : IPuseServiceCallback【这个需要F12进入PuseServiceClient,看里面的回调名称 
    {
    public void GetName(string name)
    {
    Console.WriteLine(name);
    }
    }
  • 相关阅读:
    ubuntu下安装常用软件合集
    Ubuntu16升级到18
    VScode安装教程
    查看系统信息脚本
    Excel应用笔记
    后缀数组
    笔记-AHOI2013 差异
    二分图
    动态规划dp
    笔记-CF1354E Graph Coloring
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/6486794.html
Copyright © 2011-2022 走看看