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