我有一个使用Java编写的客户端的Web服务。该服务在防火墙后面工作,如果java客户端想要使用该服务,则其请求被阻止,因为该请求包含链接。所以请求包含这样的验证器引用:
...<S:Envelope xmlns:S="http://schemas.xmlsoap.org/wsdl/"...
我要在wsdl文件中修复它吗?这是唯一包含此链接的地方:
<definitions targetNamespace="http://mycompany.com/" name="RentalServiceService"
xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy"
xmlns:tns="http://mycompany.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
如果我从wsdl文件生成.net中的客户端,那么它不会将任何链接引用放入请求中... 谢谢 佐尔坦
答案 0 :(得分:1)
不要从XML消息中删除命名空间。改为配置防火墙!
通常情况下,SOAP对防火墙很友好,因为它背靠HTTP。如果从XML中删除命名空间,则可能通过防火墙获取它,但必须使用该消息的Web服务可能无法解析它,因为您从中删除了命名空间。 XML namespaces非常重要,因为它们可以正确识别邮件中每个元素所属的域。
正如观察一样,<S:Envelope xmlns:S="http://schemas.xmlsoap.org/wsdl/"...
是某种类型的复制粘贴错误?...或者可能是问题的一部分?! SOAP信封的名称空间对于SOAP 1.1应为http://schemas.xmlsoap.org/soap/envelope/
,对于SOAP 1.2应为http://www.w3.org/2003/05/soap-envelope
。
除此之外,如果SOAP消息格式正确,它应该通过防火墙。如果没有,那么解决方案是正确配置防火墙而不是弄乱SOAP消息。您的网络管理员应该花时间了解Web服务安全性并正确配置防火墙。
我的建议是将端口80仅用于您的用户对浏览器的请求/响应,并使用正确的配置在不同的端口号上公开该服务。也许你甚至可以在reverse proxy内设置一个DMZ来提高网络服务的安全性。这样,您就不会将内部Web服务服务器直接暴露给Internet。