[索引页]
[×××] 


化零为整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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理     /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// IOneWay接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        [ServiceContract]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public interface IOneWay
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 不使用OneWay(同步调用)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                [OperationContract]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                void WithoutOneWay();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 使用OneWay(异步调用)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                [OperationContract(IsOneWay=true)]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                void WithOneWay();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// OneWay类
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public class OneWay : IOneWay
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 不使用OneWay(同步调用)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 抛出Exception异常
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void WithoutOneWay()
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        throw new System.Exception("抛出Exception异常");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 使用OneWay(异步调用)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 抛出Exception异常
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void WithOneWay()
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        throw new System.Exception("抛出Exception异常");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
 
2、宿主
OneWay.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理using (ServiceHost host = new ServiceHost(typeof(WCF.ServiceLib.Message.OneWay)))
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        host.Open();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.WriteLine("服务已启动(WCF.ServiceLib.Message.OneWay)");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.WriteLine("按<ENTER>停止服务");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.ReadLine();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <!--name - 提供服务的类名-->
            <!--behaviorConfiguration - 指定相关的行为配置-->
            <service name="WCF.ServiceLib.Message.OneWay" behaviorConfiguration="MessageBehavior">
                <!--address - 服务地址-->
                <!--binding - 通信方式-->
                <!--contract - 服务契约-->
                <endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.Message.IOneWay" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:12345/Message/OneWay/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="MessageBehavior">
                    <!--httpGetEnabled - 使用get方式提供服务-->
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// 演示Message.OneWay的类
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public class OneWay
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 调用IsOneWay=true的操作契约(异步操作)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void HelloWithOneWay()
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        try
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                var proxy = new MessageSvc.OneWay.OneWayClient();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                proxy.WithOneWay();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                proxy.Close();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        catch (Exception ex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                MessageBox.Show(ex.ToString());
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// 调用IsOneWay=false的操作契约(同步操作)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void HelloWithoutOneWay()
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        try
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                var proxy = new MessageSvc.OneWay.OneWayClient();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                proxy.WithoutOneWay();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                proxy.Close();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        catch (Exception ex)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                                MessageBox.Show(ex.ToString());
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <client>
            <!--address - 服务地址-->
            <!--binding - 通信方式-->
            <!--contract - 服务契约-->
            <endpoint address="http://localhost:12345/Message/OneWay/" binding="basicHttpBinding" contract="MessageSvc.OneWay.IOneWay" />
        </client>
    </system.serviceModel>
</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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// IDuplex接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <remarks>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// CallbackContract - 回调接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </remarks>

化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        [ServiceContract(CallbackContract = typeof(IDuplexCallback))]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public interface IDuplex
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// Hello
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <param name="name">名字</param>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                [OperationContract(IsOneWay = true)]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                void HelloDuplex(string name);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// IDuplex回调接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public interface IDuplexCallback
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// Hello
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <param name="name"></param>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                [OperationContract(IsOneWay = true)]
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                void HelloDuplexCallback(string name);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// Duplex类
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public class Duplex : IDuplex
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// Hello
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <param name="name">名字</param>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void HelloDuplex(string name)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        // 声明回调接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        IDuplexCallback callback = OperationContext.Current.GetCallbackChannel<IDuplexCallback>();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        // 调用回调接口中的方法
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        callback.HelloDuplexCallback(name);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
 

2、宿主
Duplex.cs
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理using (ServiceHost host = new ServiceHost(typeof(WCF.ServiceLib.Message.Duplex)))
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        host.Open();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.WriteLine("服务已启动(WCF.ServiceLib.Message.Duplex)");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.WriteLine("按<ENTER>停止服务");
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        Console.ReadLine();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <!--name - 提供服务的类名-->
            <!--behaviorConfiguration - 指定相关的行为配置-->
            <service name="WCF.ServiceLib.Message.Duplex" behaviorConfiguration="MessageBehavior">
                <!--address - 服务地址-->
                <!--binding - 通信方式-->
                <!--contract - 服务契约-->
                <!--双向通讯可以基于Http, TCP, Named Pipe, MSMQ;其中基于Http的双向通讯会创建两个信道(Channel),即需要创建两个http连接-->
                <!--endpoint address="Message/Duplex" binding="wsDualHttpBinding" contract="WCF.ServiceLib.Message.IDuplex" /-->
                <endpoint address="Message/Duplex" binding="netTcpBinding" contract="WCF.ServiceLib.Message.IDuplex" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:12345/Message/Duplex"/>
                        <add baseAddress="net.tcp://localhost:54321/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="MessageBehavior">
                    <!--httpGetEnabled - 使用get方式提供服务-->
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// 演示Message.Duplex的类
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public class Duplex
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// Hello
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <param name="name">名字</param>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void HelloDulex(string name)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        var ct = new Client2.Message.CallbackType();
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        var ctx = new InstanceContext(ct);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        var proxy = new MessageSvc.Duplex.DuplexClient(ctx);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        proxy.HelloDuplex(name);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
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
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理{
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// 实现回调接口
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        public class CallbackType : MessageSvc.Duplex.IDuplexCallback
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// Hello
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// </summary>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                /// <param name="name">名字</param>
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                public void HelloDuplexCallback(string name)
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                {
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                        MessageBox.Show("Hello: " + name);
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理                }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理        }
化零为整WCF(6) - 消息处理(异步调用OneWay, 双向通讯Duplex)_处理}
 
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <client>
            <!--address - 服务地址-->
            <!--binding - 通信方式-->
            <!--contract - 服务契约-->
            <!--endpoint address="http://localhost:12345/Message/Duplex/" binding="wsDualHttpBinding" contract="MessageSvc.Duplex.IDuplex" /-->
            <endpoint address="net.tcp://localhost:54321/Message/Duplex" binding="netTcpBinding" contract="MessageSvc.Duplex.IDuplex" />
        </client>
    </system.serviceModel>
</configuration>
 
 

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


OK
[×××]