У меня есть проблема с Инди метод Сообщения 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=<UNDEFINED>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;
конец;
См. Если изготовление SXML Ansistring имеет значение.
Может быть, строка транслируется в UTF-16 или около того.
Контентлина в октетах и длина вашей строки находится в символах. Поскольку Sizeof (Char) = 2 в Delphi 2009+ Это несоответствие!
Возможно, лучше преобразовать свой XML в / из строки UTF8. Некоторые репликации не будут поддерживать формат Unicode Unicode Unicode.
Вы должны предоставить размер результирующего потока в качестве содержания длины.
еще лучше: не поставляйте контентную длину и позвольте indy сделать это для вас ..