在部署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 也作轉換。