频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

WCF体验之旅(11):再谈WCF的双向通讯-基于Http的双向通讯V.S.基于TCP的双向通讯

来源:博客园 作者:Artech 出处:巧巧读书 2008-03-18 进入讨论组
下一页 1 2 

【引自Artech的博客】在一个基于面向服务的分布式环境中,借助一个标准的、平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互。这个交互的过程实际上就是Message Exchange的过程。

WCF支持不同形式的Message Exchange,我们把这称之为Message Exchange Pattern(MEP),常见的MEP包括:Request/Reply,Request/Forget(One-way)和Duplex。通过采用Duplex MEP,我们可以实现在Service端Callback Client的操作。虽然WCF为我们实现底层的通信细节,使得我们把精力转移到业务逻辑的实现,进行Transport无关的编程,但是对底层Transport的理解有利于我们根据所处的具体环境选择一个合适的Transport。说到Transport, WCF 经常使用的是以下4个:Http,TCP,Named Pipe,MSMQ。由于不同协议自身的差异,他们对具体MEP的支持方式也会不同,我们今天就来谈谈Http和TCP对Duplex的支持。

一、Sample

为了使大家对在WCF如何实现双向通信(Bidirectional Communication)有一个直观的理解,我们先来看一个简单的Sample。我们照例采用下面的4层结构和Calculator的例子:

WCF体验之旅(11):再谈WCF的双向通讯-基于Http的双向通讯V.S.基于TCP的双向通讯(图一)
图1

1、Contract:Artech.DuplexWCF.Contract. ICalculator

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;

namespace Artech.DuplexWCF.Contract
{
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface ICalculator
{
[OperationContract(IsOneWay = true)]
void Add(double x, double y);
}
}

由于模拟的是通过Callback来显示Add方法计算的结果,我把Add Operation设置成One-way。在Service Contract中设置了Callback Contract,Callback Contract定义在Interface Artech.DuplexWCF.Contract. ICallback中:

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;

namespace Artech.DuplexWCF.Contract
{
[ServiceContract]
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void DisplayResult(double result);
}
}

2、Service: Artech.DuplexWCF.Service. CalculatorService

using System;
using System.Collections.Generic;
using System.Text;
using Artech.DuplexWCF.Contract;
using System.ServiceModel;

namespace Artech.DuplexWCF.Service
{
public class CalculatorService:ICalculator
{
ICalculator Members#region ICalculator Members

public void Add(double x, double y)
{
double result = x + y;
ICallback callback = OperationContext.Current.GetCallbackChannel();
callback.DisplayResult(result);
}

#endregion
}
}


在Service端,通过OperationContext.Current.GetCallbackChannel来获得Ciient指定的CallbackContext instance,进而调用Client的Operation。

3、Hosting:

Configuration:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>       
<services>
<service name="Artech.DuplexWCF.Service.CalculatorService">
<endpoint address="net.tcp://localhost:9999/calculator"  binding="netTcpBinding"

contract="Artech.DuplexWCF.Contract.ICalculator" />               
</service>
</services>
</system.serviceModel>
</configuration>

我们通过netTcpBinding来模拟基于TCP的双向通信。

文章地址: http://www.qqread.com/other-devtool/j401801.html 更多文章 更多内容请看HTTP协议专题,或进入讨论组讨论。
下一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章