2011-09-17 6 views
2

MSXML 구성 요소를 사용하여 XML을 보안 웹 서버에 POST하는 기존 델파이 코드가 있습니다.MSXML/ServerXmlHttp 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; 

감사합니다 -

+0

오류 HRESULT 코드는 무엇입니까? 그리고 그것 때문에,'IServerXmlHttpRequest' (즉, 늦은 바인딩'IDispatch' 마샬링 문제 일 것입니다)를 사용하려고하면 어떻게 될까요? 그리고'MSXML2.XmlHttp'를 사용하면 어떻게됩니까? 그리고 초기 바인딩 (예 :'IXmlHttpRequest')과 함께'msxml2.XmlHttp'을 사용하려고하면 어떻게 될까요? –

답변

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

것은 당신이 당신의 실패 임계 값의 근사치를받을 수 있습니까? 일관된 범위 내에 있습니까? 실제로 서버에서받은 내용을 기록 할 수 있습니까?

그렇다면 실제로 얼마나 많은 전화가 전송되고 있는지 알아야합니다. 증가 된 크기로 인해 일시적인 오류가 발생하는 경우 모든 내용을 한 번에 보내지 않는 것이 좋습니다. 실제 전송 한 양을 추적하고 전체 스트림 내용을 확인할 때까지 반복해야 할 수도 있습니다 실제로 전송되었습니다.

HTH

+0

임계 값은 약 50k입니다. 우리는 서버를 점검했다. 실패한 경우 사용자와 패스가 비어 있기 때문입니다. 이상한 부분은 작동 할 때 똑같은 코드입니다. – sse

+0

'실패한 경우는 사용자와 패스가 비어 있기 때문입니다.'- 사용자 및 패스 후에 더 많은 데이터가 ** 전송 **되고 해당 필드 만 건너 뜁니다. 그렇다면 분명히 내 대답이 정확하지 않고 어떤 종류의 보안 문제가 있습니다. – Vector

+0

실제로 전송 된 바이트 수로 전송하려고 시도한 바이트 수를 비교해 보았습니까? – Vector

관련 문제