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