У меня проблемы с реализацией HTTP-сервера с indy 10 в delphi 2007.
Я установил простой обработчик событий для события CommandGet.
При ответе на данные, отправленные с использованиемПОЛУЧИТЬ метод Я могу разобрать параметры и отправить XML-данные обратно без проблем.(см. код ниже)
Download := ARequestInfo.Params.Values['dld'];
Config := ARequestInfo.Params.Values['config'];
Flash := ARequestInfo.Params.Values['flash'];
Employees := ARequestInfo.Params.Values['employees'];
Schedule := ARequestInfo.Params.Values['schedules'];
AppTables := ARequestInfo.Params.Values['apptables'];
Heartbeat := NewHeartbeat;
Heartbeat.Version.Dld := Download;
Heartbeat.Version.Config := Config;
Heartbeat.Version.Flash := Flash;
Heartbeat.Version.Employee := Employees;
Heartbeat.Version.Schedule := Schedule;
Heartbeat.Version.AppTables := AppTables;
AResponseInfo.ContentType := 'application/xml';
AResponseInfo.ResponseNo := 200;
AResponseInfo.ContentText := '<?xml version="1.0" encoding="utf-8"?>' +
#13+#10 + FormatXMLData(Heartbeat.XML);
Когда я пытаюсь ответить на данные, отправленные с использованием POST, ответ никогда не отправляется indy, вместо этого TIdIOHandler вызывает EidConnClosedGracefully.Правда) линия.вот как я обрабатываю входящие данные POST
XMLDocument1.xml.Clear;
XMLDocument1.Active := True;
XMLDocument1.XML.text := ARequestInfo.FormParams;
SynMemo1.Lines.Add(ARequestInfo.FormParams);
SynMemo1.Lines.Add(#13+#10);
if XMLDocument1.XML.Count > 0 then
begin
XMLDocument1.XML.Delete(0);
XMLDocument1.XML.Delete(0);
for i := pred(xmldocument1.xml.count) downto 0 do
begin
stmp := XMLDocument1.XML.Strings[i];
if Length(stmp) > 0 then
begin
if Copy(stmp,1,1) = '<' then
break
else
XMLDocument1.XML.Delete(i);
end
else
XMLDocument1.XML.Delete(i);
end;
XMLDocument1.XML.Text := StringReplace(XMLDocument1.XML.Text,
'<Punches ', '<Punches xmlns="http://ats/punch" ', [rfReplaceAll]);
end;
Punch := GetPunches(XMLDocument1);
PunchReply := NewOperationStatus;
PunchReply.Uid := Punch.Uid;
PunchReply.NodeValue := 'OK';
stmp := '<?xml version="1.0" encoding="utf-8"?>' +
#13+#10 + FormatXMLData(PunchReply.XML);
SynMemo1.Lines.Add(stmp);
SynMemo1.Lines.Add(#13+#10);
AResponseInfo.ContentType := 'text/html';
AResponseInfo.ContentStream := TStringStream.Create(stmp);
Я использовал wireshark, чтобы увидеть, что происходит, и похоже, что indy отправляет ACK обратно перед отправкой ответа и вызывает отключение клиента.
чтобы проверить это, я настроил Apache с PHP и написал PHP-скрипт для выполнения той же работы, и все работает нормально. Разница в том, что на данные POST отвечают с содержимым ответа, а не ACK.
любые предложения о том, как решить эту проблему, чтобы я отвечал на данные POST, а также на GET.
Я застрял с этим сейчас, как вы можете видеть из этого следа проволочной акулы (нажмите на ссылку для изображения), я увеличил время ожидания до 20 секунд.и все еще не работает.Я собираюсь сделать еще несколько расследований.и посмотрим, что я смогу узнать.Похоже, Indy думает, что разъединение произошло до того, как оно
Нажмите здесь для изображения