我正在使用 Delphi 2009、Indy 版本 10.5498 以及来自https://indy.fulgan.com/SSL/的 zip 文件 openssl-1.0.2r-i386-win32 中的 libeay32.dll 和 ssleay32.dll 。范围检查在项目选项中打开,而不是在任何地方关闭。
使用下面的代码(我在 Remy 的帮助下从这篇文章中生成),我可以在打开调试的 IDE 中运行时通过 https 将数据上传到服务器上的 API,或者从打开调试时生成的已编译 exe 上传数据。
但是,如果我构建一个发布版本,那么无论我是通过 IDE 运行它还是作为 exe 运行它,我都会在线得到范围检查错误 result := HttpClient.Post(THE_URL, FormData);
参数列表仅包含收件人、发件人、主题、正文等,并且文件名列表中没有附件,即 filenames.Count = 0。U_GeneralRoutines.TheFileStoreFolder
只是 ProgramData 中存储 SSL DLL 的文件夹。
由于调试器没有捕捉到这一点,我在调用前后添加了两条显示消息行。当构建为调试时,两条消息都会显示并且发布成功。当构建为发布时,第一个显示出来,然后我得到范围检查错误。
我不认为 POST 代码中存在错误,那么可能出了什么问题?
function UploadToAPI(params, filenames: TStrings): string;
var
HttpClient: TIdHttp;
IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
FormData : TIdMultiPartFormDataStream;
i : integer;
PathToSSLlibraries : string;
begin
FormData := TIdMultiPartFormDataStream.Create;
HttpClient:= TIdHttp.Create;
IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
PathToSSLlibraries := IncludeTrailingPathDelimiter(U_GeneralRoutines.TheFileStoreFolder);
IdOpenSSLSetLibPath(PathToSSLlibraries); //set path to libeay32.dll and ssleay32.dll in the common ProgramData folder
HttpClient.IOHandler := IdSSLIOHandler;
HttpClient.Request.CustomHeaders.FoldLines := true ;
try
for i := 0 to params.Count - 1 do
FormData.AddFormField(params.Names[i], params.ValueFromIndex[i]);
for i := 0 to filenames.Count - 1 do
FormData.AddFile('attachment', filenames[i]); //works with ver 10.5498 but not with 10.2.5
//add authorisation header
HttpClient.Request.CustomHeaders.Add('Authorization:Basic ' + ATHORISATION_STR); //byte64 encoding of the api key
HttpClient.ProtocolVersion := pv1_1; //get the full server response which allows for just one try-except
HttpClient.HTTPOptions := HttpClient.HTTPOptions + [hoKeepOrigProtocol, hoNoProtocolErrorException, hoWantProtocolErrorContent];
try
showmessage('about to post');
result := HttpClient.Post(THE_URL, FormData); //post to the api
showmessage('posted');
except
on E: Exception do
begin
result := E.ClassName + ': ' + E.message;
raise;
end;
end; //try
finally
FormData.Free;
IdSSLIOHandler.free;
HttpClient.free;
end;
我很欣赏这种情况通常是由发布版本中未初始化的变量引起的,这些变量在 IDE / 调试时会自动初始化。但是我的程序中的所有变量似乎都在调用 POST 之前被初始化。