Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSXML/ServerXmlHttp POST间歇性失败(Delphi)_Delphi_Http Post_Msxml_Winhttp_Serverxmlhttp - Fatal编程技术网

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

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失败来验证这一点。我也可以做相反的验证(即,获取一个大文件并逐渐减少它,直到它成功发布) 下面是一些示例

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

阈值约为50k。我们确实检查了服务器。当出现故障时,这是因为用户和密码为空。奇怪的是,它工作时的代码完全相同。“当出现故障时,这是因为用户和密码为空”-是否意味着在发送用户和密码后有更多数据,只是跳过了这些字段?如果是这样的话,显然我的答案是不正确的,并且您遇到了某种安全问题。您是否尝试过将您尝试传输的字节数与实际发送的字节数进行比较?我不明白的是,您将用户/通行证与XML文档分开发送-那么为什么XML文档的大小会影响用户/通行证。另外,您说代码已经运行了很多年:它们是否是环境、基础设施等方面的变化导致了这种新行为?我在这方面做了很多工作,所以我觉得这个问题很有趣……阈值大约是50k。我们确实检查了服务器。当出现故障时,这是因为用户和密码为空。奇怪的是,它工作时的代码完全相同。“当出现故障时,这是因为用户和密码为空”-是否意味着在发送用户和密码后有更多数据,只是跳过了这些字段?如果是这样的话,显然我的答案是不正确的,并且您遇到了某种安全问题。您是否尝试过将您尝试传输的字节数与实际发送的字节数进行比较?我不明白的是,您将用户/通行证与XML文档分开发送-那么为什么XML文档的大小会影响用户/通行证。另外,您说代码已经运行了很多年:它们是否是环境、基础设施等方面的变化导致了这种新行为?我在这方面做了很多工作,所以我觉得这个问题很有趣……什么是失败的HRESULT代码?而且,如果您尝试使用
IServerXmlHttpRequest
(即,可能是后期绑定
IDispatch
编组问题),会发生什么情况。如果您尝试使用
MSXML2.XmlHttp
,会发生什么?如果您尝试将
msxml2.XmlHttp
与早期绑定(即
IXmlHttpRequest
)一起使用,会发生什么情况?HRESULT代码失败的原因是什么?而且,如果您尝试使用
IServerXmlHttpRequest
(即,可能是后期绑定
IDispatch
编组问题),会发生什么情况。如果您尝试使用
MSXML2.XmlHttp
,会发生什么?如果您尝试使用带有早期绑定的
msxml2.XmlHttp
(即
IXmlHttpRequest
),会发生什么情况?