我需要使用Savon Ruby客户端来使用SOAP Web服务。我认为端点是使用.NET框架编写的,事实上,我们目前有一个由服务团队提供的.NET客户端库。
使用客户端库时,它运行良好,数据检索成功,但在使用Savon客户端时,我得到了:
(a:InvalidSecurity) The caller was not authenticated by the service. (Savon::SOAPFault)
问题是,我们已经检查了SOAP请求,两者似乎都是一样的。唯一的区别是一个使用Ruby完成,另一个使用.NET完成。
以下是两个请求的几个示例: .NET客户端
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Identity xmlns="http://vauto.com/webservices/Haystak/1.0/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<AccessId>2A6B3F9FC49D1F4388AF7064045D964E</AccessId>
<AccessStamp>2014-01-31T16:46:07.1597194-05:00</AccessStamp>
<Signature>et0KyY1ZnjCM5z7BhQR9Q3Fj7V4=</Signature>
</Identity>
</s:Header>
<s:Body>
<GetVehicles xmlns="http://vauto.com/webservices/Haystak/1.0/">
<request xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<EntityId>TEST01</EntityId>
</request>
</GetVehicles>
</s:Body>
</s:Envelope>
Ruby客户端:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsdl="http://vauto.com/webservices/Haystak/1.0/"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<Identity xmlns="http://vauto.com/webservices/Haystak/1.0/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<AccessId>2A6B3F9FC49D1F4388AF7064045D964E</AccessId>
<AccessStamp>2014-02-03T10:24:50.3690365-05:00</AccessStamp>
<Signature>ykKc5tWCyY9UVb+zw50hfAxOnSA=</Signature>
</Identity>
</env:Header>
<env:Body>
<wsdl:GetVehicles>
<request xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<EntityId>TEST01</EntityId>
<EntityName i:nil="true" />
<HaystakId i:nil="true" />
<Vins i:nil="true"
xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
</request>
</wsdl:GetVehicles>
</env:Body>
Web服务的WSDL如下:
非常感谢任何帮助。我有点迷茫,不知道还有什么可以尝试使用该网络服务。
答案 0 :(得分:1)
有几件事:
<wsdl:GetVehicles>
请求(Savon),另一个是<HelloWorld>
(.NET)。xmlns:wsdl="http://tempuri.org/"
看起来无效。SOAP是用词不当,因为它并不简单,而且我一直认为,当你在微软和非微软生态系统之间进行通话时,它会更加困难。
首先,确保在两个客户端中生成相同的请求,并从那里获取。相同的请求应该引起相同的回应。