首页 > 代码库 > WCF系列之双工通信
WCF系列之双工通信
WCF双工通信允许客户端调用服务器端,也允许通过回调,实现服务器端调用客户端,并不是所有的协议都支持双工通信,比如HTTP协议是不支持双工通信的。
我们来看一下契约的定义,其中在ServiceContract指定了CallbackContract,定义了ICalculateCallback,回调契约不需要指定为ServiceContract,但是方法要标记为OperationContract,可以看到服务契约和回调的方法均指定为IsOneWay=true,返回值都是void。
下一步,再来看一下服务的实现。
通过上下文获取当前的回调信道对象,调用客户端的方法,该方法需要在客户端进行实现。
下面再来看一下客户端的代理类的实现。
//------------------------------------------------------------------------------// <auto-generated>// 此代码由工具生成。// 运行时版本:4.0.30319.42000//// 对此文件的更改可能会导致不正确的行为,并且如果// 重新生成代码,这些更改将会丢失。// </auto-generated>//------------------------------------------------------------------------------[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")][System.ServiceModel.ServiceContractAttribute(ConfigurationName="ICalculate", CallbackContract=typeof(ICalculateCallback))]public interface ICalculate{ [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ICalculate/Add")] void Add(int a, int b); [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ICalculate/Add")] System.Threading.Tasks.Task AddAsync(int a, int b);}[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]public interface ICalculateCallback{ [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ICalculate/Show")] void Show(int result);}[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]public interface ICalculateChannel : ICalculate, System.ServiceModel.IClientChannel{}[System.Diagnostics.DebuggerStepThroughAttribute()][System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]public partial class CalculateClient : System.ServiceModel.DuplexClientBase<ICalculate>, ICalculate{ public CalculateClient(System.ServiceModel.InstanceContext callbackInstance) : base(callbackInstance) { } public CalculateClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) : base(callbackInstance, endpointConfigurationName) { } public CalculateClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { } public CalculateClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { } public CalculateClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(callbackInstance, binding, remoteAddress) { } public void Add(int a, int b) { base.Channel.Add(a, b); } public System.Threading.Tasks.Task AddAsync(int a, int b) { return base.Channel.AddAsync(a, b); }}
InstanceContext在调用的时候,指定了客户端回调方法的定义信息,实现通信由WCF框架基础提供了通信实现。
CalculateClient client = new CalculateClient(new InstanceContext(new CalculateCallback())); client.Add(1, 1); Console.ReadLine();
客户端实现了回调的协议
public class CalculateCallback : ICalculateCallback { public void Show(int result) { Console.WriteLine("结果是:" + result); } }
配置方面与上一篇《WCF系列之(IIS-TCP)》的配置一致,这里不再重复解释。
WCF系列之双工通信
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。