我有一些遗留的 Delphi 代码,它们使用 MSXML 组件将 XML 发布到安全的 Web 服务器。
该代码多年来一直运行良好。 最近,我们做了一些更改,使 XML 文件大小变大了一点,但幅度不大。 XML大小本身仍然相对较小,例如100k或更小。
我们检查了服务器日志,失败是身份验证错误,因为用户/密码“有时”未通过。 这种情况间歇性地发生。 唯一改变的是 XML 大小增加了一点。 我可以通过增量增长 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;
谢谢你-
你能得到失败阈值的近似值吗?是否在一个一致的范围内? 您可以记录您的服务器实际收到的内容吗?
话虽如此,我想说你需要检查你的字节数 - 实际上有多少是通过网络发送的?如果大小增加导致间歇性故障,则很可能是您没有一次性发送所有内容 - 您可能必须跟踪实际发送的数量并循环,直到确定整个流内容确实已经传送了。
HTH