你来我往:wcf的双向通信(Bi-directional Communication)

简介:
我们继续改进前面的示例,实现wcf的双向通信。
示例采用前文中一样的业务逻辑(单独针对DivideOperation进行说明,另外两个方法我们注释掉不再讨论)——调用一个数学除法计算的远程调用,除了传递相应的操作参数之外,我们还传递一个对象,这个对象可以 在Server端中回调 (Callback) 把运算结果在Client端显示出来。
我们来看一下改进的步骤和实现:
1、IGetDataCallback.cs
ContractedBlock.gif Code
2、IGetDataService.cs
ContractedBlock.gif Code
注意点:

(1).在一个分布式的环境中,Client能够调用Service,它必须知道Service的Contract, Contract定义了Service暴露给外界的所有可用的Operation,以及这些Operation的签名(Signature).至于Service中定义的Opertion采用怎样的实现,Client不需要了解。这也是在WCF中把contract契约与具体的实现相互分离的一个重要原因——我们把Contract单独提取出来,把他暴露给Client,从而可以避免把过多的暴露业务逻辑的实现。
(2).在一个分布式的环境中,Server端和Client并不是一成不变的,他们是可以相互转化的。提供服务的就是Server,消费Service的就是Client。在这个例子中,当MyClient调用Host在MyWcfWebHost中的GetDataService(定义在MyWcfLib类库中),MyClient是Client,而Server端的执行环境是MyWcfWebHost。而当GetDataService回调(Callback)Client的逻辑把运算结果显示出来时候,因为Callback的逻辑是MyClient中执行的,所以MyClient成了Server,而GetDataCallbackHandler(定义在MyClient中)成了真正的Service。
(3).我们已经说过Client能够调用Service,它必须知道Service的Contract。所以GetDataService能过Callback MyClient,它也必须知道回调操作的Contract。WCF通过在ServiceContractAttribute中的CallbackContrac参数制定。
2、在GetDataService中定义服务:

ContractedBlock.gif Code

需要注意:在客户端的app.config文件我们把binding设置为"wsDualHttpBinding",也就是可以双向通信的绑定。您还可以设置其他的双向绑定。
3、客户端的通信测试
(1)、callback调用的服务

代码

 (2)、双向通信测试代码
我们依然在一个控制台应用程序中进行简单测试:

代码

 4、注意点
测试时发现的两个异常:
(1)、“HTTP 无法注册 URL...,因为另一应用程序正在使用 TCP 端口 80。”
施展google大法后发现这是xp系统或者iis5.x的常见问题,您可以直白地把它理解为“tmd,老子的回调服务的监听端口80被占用啦”,所以解决的方法就是,

代码

 正如你所看见的,我们独立为它配置一个不同的双向绑定的clientBaseAddress的端口就可以了。
(2)、“在消息传输完成以前关闭会话”
这个问题是在测试的时候发现的,我在测试代码里也写了注释。分析过后发现,原来我们将proxy转换为一个IDisposable的对象后(using (proxy as IDisposable)这一句),在测试代码的try块内,如果没有 Console.ReadKey();这一行,clr会调用Dispose()方法进行回收,试图关闭底层的用于双向通信的信道,如果在回调操作尚未执行完毕就关闭网络连接,将会导致回调无法正常执行。








本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/01/14/1542850.html,如需转载请自行联系原作者

目录
相关文章
|
9月前
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
8月前
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
38 0
|
8月前
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
59 0
Visual Studio 2022 创建 WCF服务 找不到
Visual Studio 2022 创建 WCF服务 找不到
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
102 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
850 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1048 0