MSXML/ServerXmlHttp POST间歇性失败(Delphi)
我有一些遗留的Delphi代码,它使用MSXML组件将XML发布到安全的web服务器 多年来,该准则一直运作良好。最近,我们做了一些更改,使XML文件的大小稍微大一点,但不会太大。XML大小本身仍然相对较小,例如100k或更小 我们检查了服务器日志,失败是一个身份验证错误,因为用户/密码有时无法通过。这种情况时有发生。唯一改变的是XML的大小增加了一点 我可以通过增加一个xml文件直到POST失败来验证这一点。我也可以做相反的验证(即,获取一个大文件并逐渐减少它,直到它成功发布) 下面是一些示例代码。在本例中,我从文件中加载xml。在实际代码中,我们使用流,但我确信这不是问题所在 有人知道为什么身份验证数据会在发送到https服务器的过程中丢失吗?我似乎记得MSXML在某些情况下在协商身份验证方面存在问题,但我认为这与发布的XML的大小无关MSXML/ServerXmlHttp POST间歇性失败(Delphi),delphi,http-post,msxml,winhttp,serverxmlhttp,Delphi,Http Post,Msxml,Winhttp,Serverxmlhttp,我有一些遗留的Delphi代码,它使用MSXML组件将XML发布到安全的web服务器 多年来,该准则一直运作良好。最近,我们做了一些更改,使XML文件的大小稍微大一点,但不会太大。XML大小本身仍然相对较小,例如100k或更小 我们检查了服务器日志,失败是一个身份验证错误,因为用户/密码有时无法通过。这种情况时有发生。唯一改变的是XML的大小增加了一点 我可以通过增加一个xml文件直到POST失败来验证这一点。我也可以做相反的验证(即,获取一个大文件并逐渐减少它,直到它成功发布) 下面是一些示例
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阈值约为50k。我们确实检查了服务器。当出现故障时,这是因为用户和密码为空。奇怪的是,它工作时的代码完全相同。“当出现故障时,这是因为用户和密码为空”-是否意味着在发送用户和密码后有更多数据,只是跳过了这些字段?如果是这样的话,显然我的答案是不正确的,并且您遇到了某种安全问题。您是否尝试过将您尝试传输的字节数与实际发送的字节数进行比较?我不明白的是,您将用户/通行证与XML文档分开发送-那么为什么XML文档的大小会影响用户/通行证。另外,您说代码已经运行了很多年:它们是否是环境、基础设施等方面的变化导致了这种新行为?我在这方面做了很多工作,所以我觉得这个问题很有趣……阈值大约是50k。我们确实检查了服务器。当出现故障时,这是因为用户和密码为空。奇怪的是,它工作时的代码完全相同。“当出现故障时,这是因为用户和密码为空”-是否意味着在发送用户和密码后有更多数据,只是跳过了这些字段?如果是这样的话,显然我的答案是不正确的,并且您遇到了某种安全问题。您是否尝试过将您尝试传输的字节数与实际发送的字节数进行比较?我不明白的是,您将用户/通行证与XML文档分开发送-那么为什么XML文档的大小会影响用户/通行证。另外,您说代码已经运行了很多年:它们是否是环境、基础设施等方面的变化导致了这种新行为?我在这方面做了很多工作,所以我觉得这个问题很有趣……什么是失败的HRESULT代码?而且,如果您尝试使用
IServerXmlHttpRequest
(即,可能是后期绑定IDispatch
编组问题),会发生什么情况。如果您尝试使用MSXML2.XmlHttp
,会发生什么?如果您尝试将msxml2.XmlHttp
与早期绑定(即IXmlHttpRequest
)一起使用,会发生什么情况?HRESULT代码失败的原因是什么?而且,如果您尝试使用IServerXmlHttpRequest
(即,可能是后期绑定IDispatch
编组问题),会发生什么情况。如果您尝试使用MSXML2.XmlHttp
,会发生什么?如果您尝试使用带有早期绑定的msxml2.XmlHttp
(即IXmlHttpRequest
),会发生什么情况?