在部署webservice服务时,可能会遇到这样一种场景,需要将webservice部署在局域网内,有要求可以在外网能够访问服务,一般会采用在路由器上做端口映射的方式来实现。比如在路由器上开一个端口19010,映射到服务器[192.168.0.100]上的9010端口上。
但是在部署完webservice和做端口映射之后,会遇到这样一种问题:在内部局域网上服务是正常的,但是当通过外网访问时,会发现可以使用浏览器正常打开服务页面,wdsl也能正常访问,但是当编写程序[以JAVA为例]去连接服务器时,会报服务器拒绝连接错误:
HTTP 传输错误: java.net.ConnectException: Connection refused: connect
在网上查了好多资料都没找到原因,因为网络是正常的,webservice也是正常的,也可以通过wsdl生成Java的webservice客户端代码,并且写的测试代码再使用阿里云上的webservice服务来测试时也没问题。
后来同事说了一句不行你把端口映射的端口统一一下看看,即将19010-->9010的映射改为9010-->9010试试,然后。。。就莫名的解决了,自己蒙了半天,于是在网上看了好多资料深入了解一下。
发现问题可能出现在wsdl文件上,WSDL是Web Service 描述语言,它是一种标准的服务描述语言,wsdl是vs自动生成的,通过wsdl文件会发现soap:address只是将IP做了转换,而端口却没有做转换,因为在内网发布的 WebService 发布到了 IIS 的默认网站下,端口为默认的 80 ,一般的浏览器会将 80 的端口省略,所以造成了端口丢失的假象。其实,端口没有丢失只是仍然使用的内网的端口而已。这个时候如果路由器上的映射端口不一致,就会导致服务连接不上webservice。
知道原因之后,目前能想到的解决方法有两个:
1.将映射端口改为一致,如将路由器上的端口映射改为9010映射到服务器的9010端口,这种方法是最简单的。
2.修改webserver基类,将soap:address 也作转换。
