【问题标题】:The caller was not authenticated by the service when calling from Ruby?从 Ruby 调用时调用者未通过服务身份验证?
【发布时间】:2014-02-03 15:07:49
【问题描述】:

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

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

【问题讨论】:

    标签: .net ruby wcf web-services soap


    【解决方案1】:

    有几点:

    • 您的两个 SOAP 请求在结构上非常不同,一个是 &lt;wsdl:GetVehicles&gt; 请求 (Savon),另一个是 &lt;HelloWorld&gt; (.NET)。
    • 标题中的标签顺序不同。理想情况下,这应该不会产生影响,但如果服务器上的 XML API 被延迟,它可能会导致行为不端。
    • 您的 .NET 身份块是命名空间,但您的 Savon 身份块不是。
    • 您的 Savon 请求的命名空间 xmlns:wsdl="http://tempuri.org/" 看起来无效。

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

    第一步首先,确保您在两个客户端中生成相同的请求,然后从那里获取。相同的请求应该引起相同的响应。

    【讨论】:

    • +1。 “SOAP 用词不当,因为它并不简单”……嗯,当他们说它很简单时,我以为他们是在讽刺。 “...如果服务器上的 XML API 被延迟,它可能会导致行为不端。” - 如此难以置信的真实。 “相同的请求应该引起相同的响应。”,是的,绝对如此。这就是我们在构建任何类型的服务时所期望的。
    • @theTinMan 直到你看到一个用正则表达式实现的 SOAP 服务器,你才活到现在……你是一个必须与之交互的可怜的混蛋。
    • 我会尽力打破它,所以他们必须正确地写出来。
    • 有没有办法改变 savon 的 每个 GetVehicles?我通过硬编码消息将所有内容配置为匹配,除了每个 wsdl
    • 最后,正如回复中所建议的那样,问题与使用 wsdl:GetVehicles 而不是普通的 GetVehicles 有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多