我有一个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没有接到电话,我该如何解决?
感谢。
答案 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;
进程(安装程序)本身会一直运行,直到请求完成。