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

问题描述 投票:0回答:2

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

谢谢你-

delphi http-post msxml winhttp serverxmlhttp
2个回答
0
投票
你能得到失败阈值的近似值吗?是否在一个一致的范围内?  您可以记录您的服务器实际收到的内容吗?

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

HTH


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.