我正在使用 WiX 工具集为 .NET Framework 4.8 应用程序开发自定义安装程序。在安装过程中,我需要进行 HTTPS API 调用。 API 调用在独立控制台应用程序中完美运行,但从 MSI 安装程序执行时始终失败。
问题详情: API 调用可在控制台应用程序中使用 HTTP 和 HTTPS。 在 MSI 安装程序中,HTTP 请求成功,但 HTTPS 请求失败并出现以下错误
错误:
服务器配置时发生错误:WebException API调用期间发生: https://{域名}:443/api/RPA/RpaSetupLog 状态:接收失败 回复: 消息:底层连接已关闭:An 接收时发生意外错误。 堆栈跟踪:位于 System.Net。 HttpWebRequest.GetResponseO 在自定义操作。自定义操作。 SendDataToApi(字符串 协议、字符串domainOrlp、字符串端口、字符串jsonData、 字符串 rootCertificateString, 字符串 中间证书字符串,字符串 endDomainCertificateString) 在
发生在行:O
所以问题是,我有一个 Wix 安装程序,我有 msi 安装程序,在我尝试使用 https 协议调用 api 时,它给了我错误,但在 notmal http 中它成功了,当我创建一个 consol 应用程序时,使用相同的参数和相同的功能并尝试调用它成功,我遇到了问题,在 .msi 安装程序中使用 https,我还添加了这一行
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
在 consol 应用程序中相同,它可以工作,但在 msi 安装程序中它失败
检查证书:
确保服务器使用有效的证书。对于自签名证书,我已在生产系统的证书存储中手动安装了根证书、中间证书和域证书。 在不同环境下测试:
在我的本地计算机上,控制台应用程序和 MSI 安装程序都工作正常。 关于生产系统: 控制台应用程序适用于 HTTP 和 HTTPS。 MSI 安装程序对于 HTTPS 失败。 网络连接:
验证生产系统可以解析并 ping API 域。 来自 MSI 安装程序的 HTTP 请求成功,表明网络访问可用。
Code :
private static bool SendDataToApi(string protocol, string domainOrIp, string port, string jsonData)
{
string apiUrl = $"{protocol}://{domainOrIp}:{port}/api/RPA/RpaSetupLogs";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiUrl);
request.Method = "POST";
request.ContentType = "application/json";
request.Timeout = 30000;
// Enable TLS 1.2
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Bypass SSL Validation (Tried this as a workaround)
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(jsonData);
writer.Flush();
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode != HttpStatusCode.OK)
{
throw new InvalidOperationException($"API call failed with status: {response.StatusCode}");
}
}
return true;
}
catch (WebException webEx)
{
Console.WriteLine($"WebException: {webEx.Message}, Status: {webEx.Status}");
throw;
}
}
本地系统:
Windows 10
.NET框架4.8
HTTPS 在控制台应用程序和 MSI 安装程序中均有效。
生产系统:
Windows Server 2019
HTTPS 在控制台应用程序中工作,但 在 MSI 安装程序中失败。
HTTP 在控制台应用程序和 MSI 安装程序中都能正常工作。
为什么 HTTPS 请求在 MSI 安装程序中失败,但在控制台应用程序中正常?
是否与安装程序的执行上下文、权限或环境设置有关?如果是这样,我该如何调试或解决这个问题?
WiX 安装程序在安装过程中支持 HTTPS 调用是否需要特定配置?
非常感谢任何见解或建议。谢谢!
您的自定义操作是否作为“系统”执行(即使用不同的用户配置文件)。重现:将控制台应用程序作为系统运行(即在安装发生的帐户下)。
要以当前用户身份运行您的操作:
<CustomAction Id="..."
Impersonate="yes"
...
</CustomAction>