2009-12-07 88 views
1

我有一个用RubyOnRails编写的soap webservice和一个用Delphi编写的客户端。客户端和服务器使用Delphi 2006交流良好,但与新版Delphi 2009编译会导致Rails服务器“崩溃”。消费SOAP Rails Webservice在Delphi 2009中不起作用,但在Delphi 2006中正常

这是请求(产生通过内置在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的web服务的“响应”

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“编码在德尔福2009年是不同的,但我不知道如何改变这一点。

+2

由于您没有指定如何调用web服务,因此有些猜测: 看起来您的请求没有指定编码,并且Rails接着期望使用UTF8编码。 我怀疑在Delphi 2009中它现在用UTF-16编码发送数据。 当你告诉我们你是如何实际发送请求到web服务的,那么我们可以试着解决它。 – 2009-12-07 17:09:01

+0

我使用默认方式通过THTTPRio(为WSDL生成的Delphi接口)调用webservice – 2009-12-08 08:53:10

+0

谢谢。现在你可以向我们提供服务运行的WSDL或公共URL吗? – 2009-12-08 09:42:10

回答

2

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

Delphi 2006:Content-Type:text/xml
Delphi 2009:Content-Type:text/xml;字符集= “utf-8”

解决方案:

RIO.HTTPWebNode.UseUTF8InHeader := False; 

此属性的默认值已经从2006年德尔福改为德尔福2009年

结论: 这似乎是在Ruby中的错误(在Rails上)。它可以在Windows机器上使用本地安装的web服务的Delphi版本。只有运行Linux的生产机器出现问题。

0

很难说没有更多的信息.​​..
你刚刚重新编译的代码或你有没有在D2009重新导入WSDL?
有一个很好的机会,当其他普通的字符串时,您得到1使用WideString。
而且您可能在忽略的隐式与显式字符串转换之间存在差异。

+0

是的,我重新导入了wsdl。唯一的变化是WideString变成了字符串,但结果(错误)是一样的。 – 2009-12-08 08:47:22