问题描述
发布WebServices,通过端口映射,外网访问,能看WebServer测试页面,无法调用方法
内网地址:http://ZZZ.ZZZ.ZZZ.ZZZ/WebService/Service1.asmx
外网地址:http://XXX.XXX.XXX.XXX:7890/WebService/Service1.asmx(能看页面,无法调用方法)
系统环境:将内网IP ZZZ.ZZZ.ZZZ.ZZZ 端口80 映射到外网IP XXX.XXX.XXX.XXX 端口7890
解决方法
检查内网服务wsdl
在 web.config 文件中 system.web 标签之后加入
http://ZZZ.ZZZ.ZZZ.ZZZ/WebService/Service1.asmx?wsdl
-<wsdl:service name="Service1">
-<wsdl:port name="Service1Soap" binding="tns:Service1Soap">
<soap:address location="http://ZZZ.ZZZ.ZZZ.ZZZ/Service1.asmx"/>
</wsdl:port>
-<wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
<soap12:address location="http://ZZZ.ZZZ.ZZZ.ZZZ/Service1.asmx"/>
</wsdl:port>
</wsdl:service>
对比外网服务wsdl
http://XXX.XXX.XXX.XXX:7890/WebService/Service1.asmx?wsdl
-<wsdl:service name="Service1">
-<wsdl:port name="Service1Soap" binding="tns:Service1Soap">
<soap:address location="http://XXX.XXX.XXX.XXX/Service1.asmx"/>
</wsdl:port>
-<wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
<soap12:address location="http://XXX.XXX.XXX.XXX/Service1.asmx"/>
</wsdl:port>
</wsdl:service>
结论
能看到 WebServer 服务页面,即表示端口映射成功,对比 wsdl 可判断 soap:address 只是将 ip 做了转换。
故可采取如下办法:
方式一:将内网端口7890映射到外网端口7890(保持端口一致即可)
方式二:修改 WebServer 基类,将 soap:address 也作转换