.net 从Ruby调用时,调用方未通过服务身份验证?

.net 从Ruby调用时,调用方未通过服务身份验证?,.net,ruby,wcf,web-services,soap,.net,Ruby,Wcf,Web Services,Soap,我需要使用savonruby客户机使用soapweb服务。我认为端点是使用.NET框架编写的,事实上,我们目前有一个由服务团队提供的.NET客户端库 使用客户端库时,它工作正常,数据检索成功,但使用Savon客户端时,我得到: (a:InvalidSecurity) The caller was not authenticated by the service. (Savon::SOAPFault) 问题是,我们已经检查了SOAP请求,两者似乎都是相同的。唯一的区别是一个是使用Ruby完成的,

我需要使用savonruby客户机使用soapweb服务。我认为端点是使用.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>

2A6B3F9FC49D1F4388AF7064045D964E
2014-01-31T16:46:07.1597194-05:00
et0KyY1ZnjCM5z7BhQR9Q3Fj7V4=
测试01
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>

2A6B3F9FC49D1F4388AF7064045D964E
2014-02-03T10:24:50.3690365-05:00
ykKc5tWCyY9UVb+zw50hfAxOnSA=
测试01

web服务的WSDL如下所示:

非常感谢您的帮助。我有点迷路了,不知道还要尝试什么才能使用该web服务。

有几件事:

  • 您的两个SOAP请求在结构上非常不同,一个是
    请求(Savon),另一个是
    (.NET)
  • 标题中标记的顺序不同。理想情况下,这应该不会有什么不同,但如果服务器上的XMLAPI延迟,则可能会导致行为不端
  • 您的.NET标识块已命名,但您的Savon标识块未命名
  • 您的Savon请求有一个名称空间
    xmlns:wsdl=”http://tempuri.org/“
    这看起来无效
SOAP用词不当,因为它并不简单,而且我一直认为,在Microsoft和非Microsoft生态系统之间打电话要困难得多


第一步首先,确保在两个客户机中生成相同的请求,然后从那里开始。相同的请求应该得到相同的响应。

+1。“肥皂用词不当,因为它并不简单”。。。嗯,当他们说这很简单的时候,我以为他们是在讽刺。“…如果服务器上的XML API被延迟,它会使事情变得不正常。”-真是难以置信。“相同的请求应该得到相同的响应。”,是的,确实如此。这就是我们在构建任何类型的服务时所期望的。@theTinMan在您看到用regex实现的SOAP服务器之前,您还没有活过。。。你是个可怜的混蛋,必须要和它打交道。我会尽力打破它,这样他们才能写正确。有没有办法改变savon的每辆车?我通过硬编码消息将所有内容配置为匹配,除了最后的wsdl,正如响应中所建议的那样,问题与使用wsdl:GetVehicles而不是普通GetVehicles有关