У меня есть какой-то устаревший код Delphi, который отправляет XML на защищенный веб-сервер с использованием компонента MSXML.
Код работал отлично в течение многих лет.Недавно мы внесли некоторые изменения, которые делают размер файла XML немного больше, но ненамного.Сам размер XML все еще относительно мал, например, 100 КБ или меньше.
Мы проверили журналы сервера, и сбой является ошибкой аутентификации из-за того, что user / pass иногда не передается.Это происходит с перерывами.Единственное, что изменилось, это то, что размер XML немного увеличился.
Я могу убедиться в этом, постепенно увеличивая файл XML до тех пор, пока не произойдет сбой POST.Я также могу проверить, выполнив обратное (то есть, взяв большой файл и постепенно уменьшая его, пока он успешно не выполнит POST).
Вот пример кода ниже.В этом случае я загружаю XML из файла.В реальном коде мы используем потоки, но я уверен, что это не проблема.
Кто-нибудь знает, почему данные аутентификации будут потеряны на пути к серверу https?Кажется, я кое-что вспомнил, что в некоторых случаях у MSXML возникали проблемы с согласованием аутентификации, но я не думаю, что это связано с размером публикуемого XML.
procedure TForm1.IntermittentFail;
Var
Resp : TStringStream ;
ole : OleVariant;
HTTPParams: TStrings;
aStream : TStream;
FXMLDoc : TXMLDocument ;
FXMLResp : TXMLDocument;
user, pass, URL, CommonStr : string;
begin
if not(odXMLFile.Execute) then
exit;
user := 'JoeUser';
pass := 'password
URL := 'https://aURL.com';
CommonStr := 'ParameterString';
FXMLDoc := TXMLDocument.Create(Nil);// create the outgoing doc
FXMLResp := TXMLDocument.Create(Nil);// create the response doc
Resp := nil;
FXMLDoc.LoadFromFile(odXMLFile.FileName);
ole := CreateOleObject('MSXML2.ServerXmlHttp');
ole.open('POST' ,URL , false, user, pass);
ole.SetTimeouts( 0, 60000, 300000, 300000);
//ole.SetTimeouts( 300000, 300000, 300000, 300000); //no effect.
ole.setOption(3, CommonStr);
//ole.setrequestheader('connection', 'close'); //no effect //sleep(5000); //no effect
ole.Send(FXMLDoc.XML.Text); //THIS WILL INTERMITTENTLY FAIL.
Resp := TStringStream.Create(ole.ResponseText);
finally
ole := Unassigned;
if Assigned(Resp) then
Resp.Free;
FXMLDoc.Free;
FXMLResp.Free;
end;
end;
Спасибо -