[索引页]
[源码下载]


化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)


作者:webabcd


介绍
WCF(Windows Communication Foundation) - 消息处理:通过操作契约的IsOneWay参数实现异步调用,基于Http, TCP, Named Pipe, MSMQ的双向通讯。


示例(异步调用OneWay)
1、服务
IOneWay.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace WCF.ServiceLib.Message

OneWay.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace WCF.ServiceLib.Message


2、宿主
OneWay.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using (ServiceHost host = new ServiceHost(typeof(WCF.ServiceLib.Message.OneWay)))
}

App.config
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)<?xml version="1.0" encoding="utf-8" ?>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
<configuration>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
<system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<services>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--name - 提供服务的类名-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--behaviorConfiguration - 指定相关的行为配置-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<service name="WCF.ServiceLib.Message.OneWay" behaviorConfiguration="MessageBehavior">
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--address - 服务地址-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--binding - 通信方式-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--contract - 服务契约-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.Message.IOneWay" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<host>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<baseAddresses>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)            
<add baseAddress="http://localhost:12345/Message/OneWay/"/>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
</baseAddresses>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
</host>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
</service>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</services>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<behaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<serviceBehaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<behavior name="MessageBehavior">
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<!--httpGetEnabled - 使用get方式提供服务-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<serviceMetadata httpGetEnabled="true" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<serviceDebug includeExceptionDetailInFaults="true"/>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
</behavior>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
</serviceBehaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</behaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
</system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
</configuration>


3、客户端
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Windows.Forms;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace Client2.Message

App.config
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)<?xml version="1.0" encoding="utf-8" ?>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
<configuration>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
<system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<client>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--address - 服务地址-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--binding - 通信方式-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--contract - 服务契约-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<endpoint address="http://localhost:12345/Message/OneWay/" binding="basicHttpBinding" contract="MessageSvc.OneWay.IOneWay" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</client>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
</system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
</configuration>


运行结果:
单击"btnWithOneWay"按钮,没有弹出提示框。(异步操作)
单击"btnWithoutOneWay"按钮,弹出错误提示框。(同步操作)



示例(双向通讯Duplex)
1、服务
IDuplex.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace WCF.ServiceLib.Message

Duplex.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace WCF.ServiceLib.Message


2、宿主
Duplex.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using (ServiceHost host = new ServiceHost(typeof(WCF.ServiceLib.Message.Duplex)))
}

App.config
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)<?xml version="1.0" encoding="utf-8" ?>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
<configuration>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
<system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<services>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--name - 提供服务的类名-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--behaviorConfiguration - 指定相关的行为配置-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<service name="WCF.ServiceLib.Message.Duplex" behaviorConfiguration="MessageBehavior">
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--address - 服务地址-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--binding - 通信方式-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--contract - 服务契约-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--双向通讯可以基于Http, TCP, Named Pipe, MSMQ;其中基于Http的双向通讯会创建两个信道(Channel),即需要创建两个http连接-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<!--endpoint address="Message/Duplex" binding="wsDualHttpBinding" contract="WCF.ServiceLib.Message.IDuplex" /-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<endpoint address="Message/Duplex" binding="netTcpBinding" contract="WCF.ServiceLib.Message.IDuplex" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<host>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<baseAddresses>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)            
<add baseAddress="http://localhost:12345/Message/Duplex"/>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)            
<add baseAddress="net.tcp://localhost:54321/"/>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
</baseAddresses>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
</host>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
</service>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</services>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<behaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<serviceBehaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
<behavior name="MessageBehavior">
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<!--httpGetEnabled - 使用get方式提供服务-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<serviceMetadata httpGetEnabled="true" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)          
<serviceDebug includeExceptionDetailInFaults="true"/>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)        
</behavior>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
</serviceBehaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</behaviors>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
</system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
</configuration>


3、客户端
Duplex.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.ServiceModel;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Windows.Forms;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace Client2.Message

CallbackType.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)using System;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Collections.Generic;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Linq;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Text;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
using System.Windows.Forms;
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
namespace Client2.Message

App.config
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)<?xml version="1.0" encoding="utf-8" ?>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
<configuration>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
<system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
<client>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--address - 服务地址-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--binding - 通信方式-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--contract - 服务契约-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<!--endpoint address="http://localhost:12345/Message/Duplex/" binding="wsDualHttpBinding" contract="MessageSvc.Duplex.IDuplex" /-->
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)      
<endpoint address="net.tcp://localhost:54321/Message/Duplex" binding="netTcpBinding" contract="MessageSvc.Duplex.IDuplex" />
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)    
</client>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)  
</system.serviceModel>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)
</configuration>


运行结果:
单击"btnDuplex"按钮后弹出提示框显示"Hello: webabcd"


OK
[源码下载]

相关文章: