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);
    }
    }
  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/6486794.html
Copyright © 2011-2022 走看看