项目背景:移植一个WCF Service 到 Linux 上,Mono版本: 2.10.6 (这里的Mono指的是Mono Run-time)
问题: 以NetTcpbinding 为基础的 Service EndPoint 一直在通信有问题,客户端总是提示积极拒绝的错误。
解决:有两个问题, 在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 是主机名)。