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);
}
}

 

posted @ 2017-03-01 22:52  逍遥帝君  阅读(4252)  评论(0编辑  收藏  举报