Проблема с инди сообщение IdHttp в Delphi 2010

У меня есть проблема с Инди метод Сообщения IdHttp. Функциональный CallRpc () скомпилированный с Delphi, 2007 хорошо работает, но тот же код, скомпилированный с Delphi 2010, повышает исключение.

Что я должен рассмотреть, когда я изменяю Инди Delphi 2007 TIdHttp на Инди Delphi 2010 TIdHttp?

function CallRpc(const sURL, sXML: string): string;
var
  SendStream : TStream;
  IdHttp     : TIdHttp;
begin
  SendStream := TMemoryStream.Create;
  IdHttp := TIdHttp.Create(nil);
  try
      IdHttp.Request.Accept        := '*/*';
      IdHttp.Request.ContentType   := 'text/sXML';
      IdHttp.Request.Connection    := 'Keep-Alive';
      IdHttp.Request.ContentLength := Length(sXML);

      StringToStream(sXML, SendStream);  
      SendStream.Position := 0;

      Result := IdHttp.Post(sURL, SendStream);
  finally
    IdHttp.Free;
    SendStream.Free;
  end;
end;

Дополнение 25.01.2009:

Исключение - это: EIdConnClosedGracefully

Ответ - это:

<?xml version='1.0' encoding='us-ascii'?>
<!DOCTYPE Error [ <!ELEMENT Error (ErrorMessage,DebuggingInfo*)> <!ATTLIST Error Date CDATA #REQUIRED Time CDATA #REQUIRED> <!ELEMENT ErrorMessage (#PCDATA )>  <!ELEMENT DebuggingInfo (#PCDATA )> ] >
<Error Date='01/25/2010' Time='08:57:12'>
<ErrorMessage>
    XML SERVER ERROR: There was a SYSTEM ERROR error in the Incoming XML Response: $ZE=&lt;UNDEFINED&gt;lexan+196^%eXMLLexAnalyzer
</ErrorMessage>

Решение 26.1.2009:

function CallRpc(const sURL, sXML: string): string; 
var 
  SendStream : TStream; 
  IdHttp     : TIdHttp; 
  sAnsiXML: Ansistring;   // <-- new
begin 
  sAnsiXML := sXML;  // <-- new: Implicit string cast

  SendStream := TMemoryStream.Create; 
  IdHttp := TIdHttp.Create(nil); 
  try 
     IdHttp.Request.Accept        := '*/*'; 
     IdHttp.Request.ContentType   := 'text/sXML'; 
     IdHttp.Request.Connection    := 'Keep-Alive'; 
     IdHttp.Request.ContentLength := Length(sAnsiXML); // <-- new

     SendStream.Write(sAnsiXML[1], Length(sAnsiXML));  // <-- new
     SendStream.Position := 0; 

     Result := IdHttp.Post(sURL, SendStream); 
  finally 
   IdHttp.Free; 
   SendStream.Free; 
  end; 

конец;

5
задан pKarelian 6 February 2010 в 07:53
поделиться

2 ответа

См. Если изготовление SXML Ansistring имеет значение.

Может быть, строка транслируется в UTF-16 или около того.

1
ответ дан 14 December 2019 в 19:13
поделиться

Контентлина в октетах и ​​длина вашей строки находится в символах. Поскольку Sizeof (Char) = 2 в Delphi 2009+ Это несоответствие!

Возможно, лучше преобразовать свой XML в / из строки UTF8. Некоторые репликации не будут поддерживать формат Unicode Unicode Unicode.

Вы должны предоставить размер результирующего потока в качестве содержания длины.

еще лучше: не поставляйте контентную длину и позвольте indy сделать это для вас ..

4
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: