从Ruby调用时,调用者没有通过服务进行身份验证?

时间:2014-02-03 15:07:49

标签: .net ruby wcf web-services soap

我需要使用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如下:

enter image description here

非常感谢任何帮助。我有点迷茫,不知道还有什么可以尝试使用该网络服务。

1 个答案:

答案 0 :(得分:1)

有几件事:

  • 您的两个SOAP请求在结构上非常不同,一个是<wsdl:GetVehicles>请求(Savon),另一个是<HelloWorld>(.NET)。
  • 标题中标记的顺序不同。理想情况下,这不应该有所作为,但如果服务器上的XML API被延迟,则会导致行为异常。
  • 您的.NET标识块是命名空间,但您的Savon标识块不是。
  • 您的Savon请求的名称空间xmlns:wsdl="http://tempuri.org/"看起来无效。

SOAP是用词不当,因为它并不简单,而且我一直认为,当你在微软和非微软生态系统之间进行通话时,它会更加困难。

首先,确保在两个客户端中生成相同的请求,并从那里获取。相同的请求应该引起相同的回应。

相关问题