2009-12-07 1 views
1

RubyOnRails로 작성된 비누 webservice와 Delphi로 작성된 클라이언트가 있습니다. 클라이언트와 서버는 Delphi 2006을 사용하여 정상적으로 통신하지만 최신 Delphi 2009로 컴파일하면 Rails 서버가 "충돌"합니다. SOAP Rails Webservice를 사용하는 것은 Delphi 2009에서는 작동하지 않지만 Delphi 2006에서는 Ok입니다.

은 (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> 

이는 레일 웹 서비스의 "응답"입니다

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에서 다릅니다. 그러나 이것을 어떻게 바꿀 것인지 잘 모릅니다.

+2

웹 서비스를 호출하는 방법을 지정하지 않았으므로 다음과 같은 메시지가 표시됩니다. 요청한 내용이 인코딩을 지정하지 않아서 Rails가 UTF8 인코딩을 필요로하는 것으로 보입니다. Delphi 2009에서는 UTF-16 인코딩으로 데이터를 전송합니다. 실제로 웹 서비스에 요청을 보내는 방법을 알려 주시면 문제를 해결할 수 있습니다. –

+0

나는 THTTPRio (델파이가 WSDL을 위해 생성 한 인터페이스)를 통해 webservice를 호출하는 기본 방법을 사용한다. –

+0

고마워. 이제 WSDL이나 서비스가 실행되는 공용 URL을 얻을 수 있습니까? –

답변

2

해결책을 찾았습니다. 기본적으로 동일한 요청 (Delphi 2006에는 XML에서 줄 바꿈과 들여 쓰기가 더 많이 있음)을 비교 한 후 HTTP 헤더 (Wireshark 사용)의 차이점을 발견했습니다. (Wireshark 사용)

Delphi 2006 : Content-Type : text/xml
Delphi 2009 : Content-Type : text/xml; 캐릭터 세트는 = "UTF-8"

솔루션 :

이 속성의 기본값은 델파이 델파이 2006에서 변경했다
RIO.HTTPWebNode.UseUTF8InHeader := False; 

2009

결론 : 루비에서 버그가 수 있도록 보인다 (on Rails). Delphi-Versions는 Windows 시스템에 로컬로 설치된 webservice와 함께 작동합니다. Linux를 실행하는 생산 시스템에서만 문제가있었습니다.

0

추가 정보 없이는 알 수 없습니다 ...
코드를 다시 컴파일 했습니까? D2009에서 WSDL을 다시 가져 왔습니까?
일반 문자열이 다른 경우 WideString을 사용하여 1을 얻을 가능성이 큽니다.
간과 한 명시 적 문자열 변환과 암시 적 문자열 변환 사이에는 차이가있을 수 있습니다.

+0

예, wsdl을 다시 가져 왔습니다. 유일한 변경 사항은 WideString이 문자열로 변환되었지만 결과 (오류)는 동일했습니다. –