山丘哥哥

WCF双工通信小结

最近一个项目涉及到分布式应用程序架构,所以就接触了WCF,这里来专门总结一下WCF中的双向通信。

我的项目中的网络结构是:一台服务器(有1个固定外网IP),其他各种各样的客户端(客户端能上外网)。 我的测试环境网络,ADSL,然后一个路由器连接局域网,局域网内所有机器上网都共享1个动态外网IP。

方式1:采用 netMsmqBinding

msmq最吸引我的地方就是它不是基于连接的,又由于我的项目对数据的实时性要求并不高,于是我就开始动手实践

                                                首先碰到1个难题就是安装, 我本机是win7环境,安装msmq很简单,我还有1个台式机是番茄花园ghost版本的,打开“windows组件安装向导”,发现找不到msmq,我记得当时在这上面安装IIS的时候,“windows组件向导”里面也没有IIS那一项,后来上网找的办法解决了(下个IIS安装文件,修改sysoc.inf文件)。我想按照安装IIS的方法,肯定可以解决,于是我拼命的google+baidu,到现在还没找到mssq单独的安装程序,我打开sysoc.inf文件,找出关于msmq的信息“msmq=msmqocm.dll,MsmqOcm,msmqocm.inf,,6”(这一句本来没有),看样子是需要msmqocm.dll这个文件,下载好了msmqocm.dll文件后,发现依然安装不了,我又用Depends.Exe工具打开这个文件,发现它还依赖另外几个dll文件,然后一一下载,没想到可以进入安装的界面了,可是始终是不能成功安装。最后实在没办法,找了1个系统盘,修复了一下,最后终于算是成功安装上了。

 

        第二个问题就是客户端想得到服务器端的回应,就得单独开启一个服务供服务器端调用,那当然需要让服务器端知道你的地址吧(类似:net.msmq://localhost/private/orderresponse ),本机、局域网环境都还可以,可是我把服务端程序部署到外网服务器上,问题就卡主了,后来又尝试了端口映射等,发了一些帖子,始终无法解答,后来就放弃了。

 

方式2:采用 WsDualHttpBinding

  虽然http也是基于连接的,但是它能穿透防火墙。所以开始动手实践(http://www.cnblogs.com/artech/archive/2007/03/02/661969.html) 

  测试的时候我把台式机做为客户端(IIS版本5.5),出现AddressAlreadyInUseException异常,原因是80端口被占用,解决的办法就是修改端口号,于是在客户端配置文件里面加了一句clientBaseAddress设为可用的地址(http://127.0.0.1:8888/ CalculatorService),现在我的程序在本机能正常运行了,当我把客户端程序单独部署在台式机上,发现TimeoutException,根据提示的异常信息,我又翻看了artech的另外2篇文章:

http://www.cnblogs.com/artech/archive/2007/03/29/692032.html 

 http://www.cnblogs.com/artech/archive/2008/08/21/1273021.html

发现错误还在,我在台式机上打开浏览器可以获取到服务的元数据信息,为什么老是抛出“打开连接超时”的异常,后来我终于发现原因了,客户端的 clientBaseAddress必须能被服务器识别,可是问题又回到了netMsmqBinding的第二个问题上。

  所以在外网的情况下,程序能正常的工作必须确保:1.客户端没安装IIS6以下的版本,即80端口要被空出来;2是在违反1的条件下,80端口被占用,让你的clientBaseAddress能被服务器所识别。


方式3:netTcpBinding 

      1,2的情况我这里用不了,只能选择tcp协议了,程序运行正常,具体实践参见artech的文章吧。

 

以上这些就是这几天学习WCF双向通信中碰到的各种问题,这里贴出来希望有人能用的上。 

 

posted on 2011-09-22 22:38  科比*布莱恩T  阅读(1595)  评论(13编辑  收藏  举报