WCF系列之双工通信

Posted 啦啦啦啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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系列之双工通信的主要内容,如果未能解决你的问题,请参考以下文章

WCF 双工连接(服务器 <-> 没有第二个客户端的客户端通信)

使用 javascript (AJAX) 的双工 WCF 服务调用

请求-响应与双工 WCF 消息交换模式

WCF入门教程五[WCF的通信模式]

WIF(使用 Thinktecture Identity Server)和双工 WCF 通道

WCF消息交换模式之请求-响应模式