异步HTTP POST请求,无需等待Inno Setup中的响应

时间:2017-06-14 10:54:01

标签: http post inno-setup pascal winhttprequest

我有一个Inno Setup Installer,需要在安装过程中进行API调用。这会将一些数据发布到远程API。

使用Pascal和WinHttpRequest对象在[Code]部分中执行POST调用。 API是ASP.Net WebAPI 2(C#)。

我可以完全控制该过程的所有部分,即Inno安装脚本,它的代码部分和WebAPI。

问题

我可以同步进行POST调用而没有任何问题,但如果我在true方法上将异步标志设置为WinHttpRequest.Open(),则.Send()方法似乎根本不执行。


procedure PostData(postural: String);
   var 
     WinHttpReq: Variant;
     ReqContent: String;
   begin
     try
       WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
       ReqContent := 'item=value';
       WinHttpReq.Open('POST', postUrl, true);
       WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
       WinHttpReq.Send(ReqContent);
     except
     end;
   end;

我在VisualStudio调试器中使用断点检查,并且永远不会调用端点。

在此处和Google上搜索时,我发现了异步获取响应的各种尝试,但我找不到解决此问题的方法。我不需要响应,这是一种即发即弃的API调用。

简明问题

为什么API没有接到电话,我该如何解决?

感谢。

1 个答案:

答案 0 :(得分:3)

要完成异步请求,WinHttpRequest的实例必须保持“活着”。

为此你必须至少确保:

  • 变量WinHttpReq一直存在,直到请求完成。即在您的特定情况下,您不能在请求完成之前离开PostData。或者您需要将WinHttpReq设为全局变量(不是PostData过程的本地变量)。

    var 
      WinHttpReq: Variant;
    
    procedure PostData(postural: String);
    var 
      ReqContent: String;
    begin
      try
        WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
        ReqContent := 'item=value';
        WinHttpReq.Open('POST', postUrl, true);
        WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        WinHttpReq.Send(ReqContent);
      except
      end;
    end;
    
  • 进程(安装程序)本身会一直运行,直到请求完成。