gpt4 book ai didi

delphi - MSXML/ServerXmlHttp POST 间歇性失败 (Delphi)

转载 作者:行者123 更新时间:2023-12-02 03:23:51 26 4
gpt4 key购买 nike

我有一些遗留的 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;

谢谢 -

最佳答案

ole.Send(FXMLDoc.XML.Text);  

您能得到失败阈值的近似值吗?是否在一个一致的范围内?您可以记录服务器实际收到的内容吗?

话虽如此,我想说您需要检查字节数 - 实际上有多少字节是通过网络发送的?如果大小增加导致间歇性故障,则很可能是您没有一次性发送所有内容 - 您可能必须跟踪实际发送的数量并循环,直到确定整个流内容确实已经传送了。

HTH

关于delphi - MSXML/ServerXmlHttp POST 间歇性失败 (Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7457247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com