由于项目需求,第一次用wcf做基于internet的访问。整理一下自己的探索,作为总结,也供自己以后回顾。
要求:(1)wcf服务需要部署在internet之中。
(2)双工通信。
出现问题:
根据上面的要求,自己首先想到的是wsDualHttpBinding. 因为httpBing可以穿越防火墙,适应于internet环境,并且可以双工通信。当部署环境为intranet,一切都OK。但当通过Internet访问wcf服务,在NAT模式下,问题出来了。总是提示访问超时。根据调试结果是由于wcf服务没法回调造成。
原因分析:
经过查找资料,搞清楚虽然wsDualHttpBinding支持双工通信,但在NAT模式下,必须通过“穿墙技术”(网上查的)来进行IP地址映射。这个自己看了很多资料,还是搞不清楚,希望哪位大侠可以帮忙。
wsDualHttpBinding双工通信原理为建立两条通道,一条供客户端和服务端通信,另一条为回调通道,供服务端和客户端通信。而这两条通道是单独的通道,回调通道并不会根据客户端到服务端的通道进行建立,而是自己单独建立一条。因此,当建立回调通道时候,在NAT模式下,回调通道是找不到所对应的客户端地址,所以出现访问超时的提示。
解决方案:
鉴于wsDualHttpBinding的限制,自己也没找到相关穿墙技术。只能用NetTcpBinding.
默认情况下,NetTcpBinding是基于intranet的,安全模式为Transport,所以要想在Internet访问必须把安全模式改为Message。即:
NetTcpBinding双工通信原理为建立一条通道,所以当客户端到服务端的通道建立之后,回调通道将采用同样的通道。所以不存在回调通道寻找客户端地址的问题。经过自己的测试可以满足上述两个要求。
下面是自己网上查找的相关协议的使用环境。
绑定和安全场景
绑定 | 局域网场景 | 互联网 | B2B场景 | 匿名场景 | 无安全场景 |
BasicHttpBinding | No | No | Yes | No | Yes |
NetTcpBinding | Yes | Yes | No | Yes | Yes |
NetPeerTcpBinding | No | No | No | No | Yes |
NetNamedPipeBinding | Yes | No | No | No | Yes |
WSHttpBinding | No | Yes | Yes | Yes | Yes |
WSFederationHttpBinding | No | No | No | No | |
WSDualHttpBinding | No | Yes | Yes | Yes | Yes |
NetMsmqBinding | Yes | No | No | Yes | Yes |
安全场景特性
特性 | 局域网场景 | 互联网 | B2B场景 | 匿名场景 | 无安全场景 |
Transport | Yes | No | No | No | No |
Message | No | Yes | Yes | Yes | No |
Service authentication | Windows | Ceritificate | Ceritificate | Ceritificate | No |
Client authentication | Windows | ASP.NET | Ceritificate | No | No |
Authorization | Windows | ASP.NET | No/ASP.NET | No | No |
Impersonation | Yes | No | No | No | No |
Intranet | Transport保护 使用tcp绑定 windows集成的安全 |
Internet | 只能使用Message形式的保护,需要数字证书 tcp wsHttp绑定 使用Membership进行安全认证 |
Anoymous | 使用Message形式的保护,需要数字证书 tcp wsHttp绑定 |
None | 消息不保护 http tcp wsHttp绑定 |
B2b | BasicHttpBinding WSHttpBinding WSDualHttpBinding
|
总结:
在发布过程中,遇到很多小问题。如服务证书认证,端口无法访问之类等问题,但这些网上都会有相关解决方案。只要自己查,都会解决的。也希望各位能给出更好的意见。