WCF技术内幕 第3章 (3)

双工消息交换模式 Duplex MEP

双工是指同时发送和接收消息。双工消息交换模式定义了一个允许接收者和发送者同时发送消息的操作集合,反之亦然。


双工消息交换模式与WSDL

与双工消息交换模式相关的WSDL包含两个操作:一个操作(SomeOperation)表示消息发送给接收者,另外一个操作(SomeCallbackOperation)表示消息从接收者回发给发送者。


双工消息交换模式与WCF契约

双工通信需要两个契约。习惯上,描述发送给接收应用程序的消息(和应答消息,如果有)的契约称为服务契约,描述接收者发送给发送者的契约称为回调契约。这两个契约通过服务契约的ServiceContractAttribute.CallbackContract属性关联。

//Service契约

using System.ServiceModel;

using CallbackContract;

namespace WcfService4
{
    [ServiceContract(
        Name = "IServiceContract", 
        CallbackContract = typeof(ICallbackService), 
        Namespace = "http://www.andersoft.com/1ServiceContract")]
    public interface IServiceContract
    {
        [OperationContract(
            Name="Sum",
            IsOneWay = true)]
        void Sum(int value1, int value2);
    }
}

//Service 实现
using System.ServiceModel;

using CallbackContract;

namespace WcfService4
{
    public class ServiceAPIs : IServiceContract
    {
        public void Sum(int value1, int value2)
        {
            int res = value1 + value2;

            ICallbackService callback = OperationContext.Current.GetCallbackChannel<ICallbackService>();
            callback.SumCallback(value1, value2, res);
        }
    }
}

//Callback 接口
using System.ServiceModel;

namespace CallbackContract
{
    public interface ICallbackService
    {
        [OperationContract(
            Name="SumCallback",
            IsOneWay=true)]
        void SumCallback(int value1, int value2, int res);
    }
}

//Callback API
using System;

namespace CallbackContract
{
    public class CallbackAPIs : ICallbackService
    {
        public void SumCallback(int value1, int value2, int res)
        {
            Console.WriteLine("{0} + {1} = {2}", value1, value2, res);
        }
    }
}

//Host
using System;
using System.ServiceModel;

using WcfService4;

namespace SVC
{
    class Program
    {
        static void Main(string[] args)
        {
            NetTcpBinding binding = new NetTcpBinding();

            ServiceHost svc = new ServiceHost(typeof(ServiceAPIs));
            svc.AddServiceEndpoint(typeof(IServiceContract), binding, "net.tcp://localhost:5678/IServiceContract");

            Console.WriteLine("Begin start host now...");
            svc.Open();
            Console.WriteLine("Host was started now...");

            Console.ReadKey();
            svc.Close();
        }
    }
}

//Client
using System;
using System.ServiceModel;

using CallbackContract;
using WcfService4;

namespace SendClient
{
    class Program
    {
        static void Main(string[] args)
        {
            NetTcpBinding binding = new NetTcpBinding();

            EndpointAddress address=new EndpointAddress(new Uri("net.tcp://localhost:5678/IServiceContract"));

            //Set callback instance class for InstanceContext
            InstanceContext context=new InstanceContext(new CallbackAPIs());

            //Set a InstanceContext
            IServiceContract services = DuplexChannelFactory<IServiceContract>.CreateChannel(context, binding, address);
            services.Sum(100, 200);

            Console.ReadKey();
        }
    }
}

当创建一个双工契约时,要记住操作作为单向操作。设置IsOneWay属性为True可以减少每次消息交互的开销。


Reference: http://www.cnblogs.com/artech/archive/2007/03/02/661969.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值