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

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

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

问题

我可以同步进行POST调用,没有任何问题,但是如果我在true方法上将async标志设置为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;

我在Visual Studio调试器中检查了断点,但从未调用过端点。

在此处和Google上进行搜索时,我仅发现了各种尝试以异步方式获取响应,但是找不到针对此问题的解决方案。我不需要响应,这是一劳永逸的API调用。

浓缩问题

为什么API无法接收该调用,我该如何解决?

谢谢。

最佳答案

为了完成异步请求,WinHttpRequest实例必须保持“事件”状态。
为此,您必须至少确保:

  • 变量WinHttpReq保留直到请求完成。 IE。在您的特定情况下,您不能在请求完成之前离开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;
    
  • 进程(安装程序)本身运行,直到请求完成为止。
  • 10-07 19:09
    查看更多