【问题标题】:Consuming a SOAP Rails Webservice doesn't work in Delphi 2009 but was Ok in Delphi 2006使用 SOAP Rails Web 服务在 Delphi 2009 中不起作用,但在 Delphi 2006 中没问题
【发布时间】:2009-12-18 02:21:12
【问题描述】:

我有一个用RubyOnRails 编写的soap web 服务和一个用Delphi 编写的客户端。客户端和服务器使用 Delphi 2006 可以正常通信,但使用较新的 Delphi 2009 进行编译会导致 Rails 服务器“崩溃”。

这是请求(由内置 THTTPRIO 生成):

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><NS1:IsValidCouponCode xmlns:NS1="urn:ActionWebService"><coupon_code xsi:type="xsd:string">1VK3K-7N45K-4V76W-JCS2F-NC125</coupon_code></NS1:IsValidCouponCode></SOAP-ENV:Body></SOAP-ENV:Envelope>

这是 Rails 网络服务的“响应”

Internal protocol error: Bad encoding name "UTF-8"
Backtrace:
/usr/lib/ruby/1.8/rexml/encoding.rb:31:in `encoding='
/usr/lib/ruby/1.8/rexml/source.rb:54:in `encoding='
/usr/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:24:in `do_parse'
/usr/lib/ruby/1.8/soap/parser.rb:92:in `parse'
/usr/lib/ruby/1.8/soap/processor.rb:39:in `unmarshal'
[...]

因此,“UTF-8”编码在 Delphi 2009 中似乎很明显有所不同,但我不知道如何更改。

【问题讨论】:

  • 由于您没有指定如何调用 web 服务,这是一些猜测:看起来您的请求没有指定编码,然后 Rails 需要 UTF8 编码。我怀疑使用 Delphi 2009 它现在以 UTF-16 编码发送数据。当您告诉我们您实际上是如何将请求发送到 Web 服务时,我们可以尝试解决它。​​
  • 我使用默认方式通过THTTPRio(Delphi为WSDL生成的接口)调用webservice
  • 谢谢。现在,您能否为我们提供运行该服务的 WSDL 或公共 URL?

标签: ruby-on-rails delphi soap web-services delphi-2009


【解决方案1】:

我找到了解决方案。在比较了基本相同的请求后(Delphi 2006 在 xml 中只有更多的换行符和缩进),我发现了 HTTP-Header 的差异(使用 Wireshark)

Delphi 2006:内容类型:文本/xml
Delphi 2009:内容类型:文本/xml; charset="utf-8"

解决方案:

RIO.HTTPWebNode.UseUTF8InHeader := False; 

此属性的默认值已从 Delphi 2006 更改为 Delphi 2009

结论: 这似乎是 Ruby(在 Rails 上)中的一个错误。它与两个 Delphi 版本一起工作,并在 Windows 机器上本地安装了 web 服务。只有运行 Linux 的生产机器有问题。

【讨论】:

    【解决方案2】:

    如果没有更多信息,很难说...
    您是刚刚重新编译代码还是在 D2009 中重新导入了 WSDL?
    当使用其他纯字符串时,您很有可能使用 WideString 获得 1。
    而且您可能会忽略隐式和显式字符串转换之间的差异。

    【讨论】:

    • 是的,我重新导入了 wsdl。唯一的变化是 WideString 变成了字符串,但结果(错误)是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多