MSXML / ServerXmlHttp POST Сбои с перерывами (Delphi) - PullRequest
2 голосов
/ 17 сентября 2011

У меня есть какой-то устаревший код 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;

Спасибо -

1 Ответ

0 голосов
/ 18 сентября 2011
ole.Send(FXMLDoc.XML.Text);  

Можете ли вы получить приблизительный порог вашего отказа?Это в пределах согласованного диапазона?Можете ли вы записать, что на самом деле было получено вашим сервером?

Сказав это, я бы сказал, что вам нужно проверить количество байтов - сколько на самом деле отправляется по проводам?Если увеличение размера вызывает прерывистый сбой, вполне возможно, что вы не отправляете весь свой контент за один проход - вам, возможно, придется отслеживать объем фактически отправленного вами материала и повторять его до тех пор, пока вы не будете уверены, что весь контент вашего потокабыл фактически передан.

HTH

...