【原创】Mono 对于WCF Net.Tcp 支持问题

项目背景:移植一个WCF Service 到 Linux 上,Mono版本: 2.10.6 (这里的Mono指的是Mono Run-time)

问题: 以NetTcpbinding 为基础的 Service EndPoint 一直在通信有问题,客户端总是提示积极拒绝的错误。

(详细问题见 http://stackoverflow.com/questions/13646692/wcf-service-on-linux-failed-to-communicate-with-client-on-windows-by-nettcp )

解决:有两个问题, 在Mono2.1.0.6当前版本下,如果 服务端代码 服务器地址写 localhost,用netstat 查看,侦听地址总是127.0.0.1,所以外部无法访问,

但是对于basichttpbinding来说,侦听地址就是0.0.0.0了,所以basichttpbinding 为基础的Service Endpoint 客户端能够访问。

根据我上边那个链接所说的,需要升级Mono版本,可是 release版本当时只有2.10.9,似乎没有解决,所以我就干脆找了最后一个一个beta版本 3.0.2,

没有对Ubuntu的build,只能自己下源代码编译并安装了(方法: http://opensimulator.org/wiki/Update_Mono_on_Ubuntu )

这次看起来侦听地址正常了,但是客户端还是访问不了,最后还是在 Stackoverflow.com 上找到答案, 原来是侦听端口的问题,nettcp默认端口是808,

但是好像在Linux下,系统会认为4000(尤其 1204)一下端口是不安全的,于是改为8080,通信正常!

当然,顺便说下,两边的NetTcpBinding 安全类型要是 SecurityMode.None

刚才升级mono只是一种解决方案,

其实如果不升级Mono的话 ,服务端代码的地址要改成 当前服务器IP地址就也可以解决这个问题。(有可能会出现No such host is known的异常,我忘了怎么解决的)

其实问题跟/etc/hosts文件有关,在我的Linux上,默认的hosts文件内容是这样的

127.0.0.1 localhost.localdomain localhost
127.0.0.1 at91sam9263_ek 

(at91sam9263_ek 是主机名)。

posted @ 2012-12-21 10:53  Mac_Lee  阅读(977)  评论(1编辑  收藏  举报