2011-09-17 41 views
2

我有一些傳統的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; 

謝謝 -

+0

什麼是失敗HRESULT代碼?而對於它而言,如果你嘗試使用'IServerXmlHttpRequest'會發生什麼(也許它是一個晚期綁定'IDispatch'編組問題)。如果你嘗試使用'MSXML2.XmlHttp',會發生什麼?如果嘗試在早期綁定時使用'msxml2.XmlHttp'(即'IXmlHttpRequest'),會發生什麼? –

回答

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

你能得到你的故障閾值的近似值?它是否在一個一致的範圍內?你能記錄你的服務器實際收到了什麼嗎?

話雖如此,我想說你需要檢查你的字節數 - 有多少實際上通過電線發送?如果大小增加導致間歇性故障,很可能是因爲您沒有一次性發送所有內容 - 您可能需要跟蹤實際發送的數量並循環,直到確定整個數據流內容爲止實際上已被傳送。

HTH

+0

閾值約爲50k。我們確實檢查了服務器。當出現故障時,這是因爲用戶和通行證是空白的。奇怪的部分是它的工作時完全相同的代碼。 – sse

+0

'當出現故障時,這是因爲用戶和密碼是空的' - 是否意味着用戶和密碼後有更多的數據,**正在發送,只是這些字段被跳過?如果是這樣,顯然我的答案是不正確的,你有一些安全問題。 – Vector

+0

您是否嘗試過比較您嘗試傳輸的字節數與實際發送的字節數? – Vector