2

MSXML コンポーネントを使用して安全な Web サーバーに XML を POST する従来の Delphi コードがあります。

コードは何年も正常に機能しています。最近、XML ファイルのサイズを少し大きくするいくつかの変更を行いましたが、それほど大きくはありません。XML のサイズ自体はまだ比較的小さく、たとえば 100k 以下です。

サーバーログを確認したところ、失敗はユーザー/パスが渡されないことがあるという事実による認証エラーです。これは断続的に発生します。唯一の変更点は、XML のサイズが少し大きくなったことです。

これは、POST が失敗するまで xml ファイルを段階的に拡張することで確認できます。逆の手順を実行して確認することもできます (つまり、大きなファイルを取得し、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;

ありがとうございました -

4

1 に答える 1

0
ole.Send(FXMLDoc.XML.Text);  

障害しきい値の概算を取得できますか?一定の範囲内ですか?サーバーが実際に受信したものをログに記録できますか?

そうは言っても、バイト数を確認する必要があると思います。実際にネットワーク経由で送信されているのはいくつですか。サイズを大きくすると断続的な障害が発生する場合は、1回のパスですべてのコンテンツを送信していない可能性があります。実際に送信した量を追跡し、ストリームコンテンツ全体が確実になるまでループする必要がある場合があります。実際に送信されました。

HTH

于 2011-09-18T05:01:08.540 に答える