5

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

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

我可以完全控制流程的所有部分,即 Inno Setup 脚本、代码部分和 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 调试器中检查了一个断点,并且端点永远不会被调用。

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


简明问题

为什么 API 没有收到呼叫,我该如何解决这个问题?

谢谢。

4

1 回答 1

4

为了完成异步请求,实例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;
    
  • 进程(安装程序)本身会一直运行,直到请求完成。

于 2017-06-14T11:17:54.133 回答