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;
ありがとうございました -