我有一些傳統的Delphi代碼,使用MSXML組件將XML發佈到安全的Web服務器。MSXML/ServerXmlHttp POST間歇性失敗(德爾福)
該代碼已運行良好多年。最近,我們做了一些改變,使得XML文件的大小有點大,但不是太大。 XML大小本身仍然相對較小,例如,100k或更少。
我們檢查了服務器日誌,由於用戶/密碼爲,有時未通過,因此失敗是驗證錯誤。這種情況是間歇性的。唯一改變的是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;
謝謝 -
什麼是失敗HRESULT代碼?而對於它而言,如果你嘗試使用'IServerXmlHttpRequest'會發生什麼(也許它是一個晚期綁定'IDispatch'編組問題)。如果你嘗試使用'MSXML2.XmlHttp',會發生什麼?如果嘗試在早期綁定時使用'msxml2.XmlHttp'(即'IXmlHttpRequest'),會發生什麼? –