wix 自定义操作发送 http post 不工作

wix custom action send http post not working

我有一个自定义操作来执行 http post 以发送到 google 分析以跟踪安装。我的自定义操作执行其他操作并且这些操作有效。所以我知道正在调用我的自定义操作。我正在使用需要引用 System.Net.Http 的 HttpClient。我认为问题出在参考文献上。为了确保可以找到参考资料,我必须做些什么特别的事情吗?

我在一个单独的项目中测试了代码以确保代码可以正常工作,而且确实如此。当我尝试 运行 msi 时,它只是安装失败。我把整个 http post 放在一个 try 语句中来解决这个问题,所以至少安装不会失败。

有人知道它可能是什么或要检查什么吗?

UPDATED COMMENTS: In order to address the downvotes: accessing the Internet in your MSI setup is not advisable due to the overall nature of the MSI technology. It is an old technology not designed for the Internet age. It was designed to install Microsoft Office way back in the 90s (though there are rumors that the Windows Store might allow MSI files to be downloaded now in 2021).

Even accessing the local network from custom actions is difficult due to impersonation as SYSTEM when running in deferred mode (custom actions with admin access to system).

The normal situation is that SYSTEM context can access the network via the machine account only. See mind map of this - the map is based on this SO answer.

Proxy servers, firewalls, security software and other mechanisms can interfere with non-system context custom actions trying to access the Internet. There could also be no user logged on when the package is deployed silently.

Just write a flag to the registry and have the application report the fresh install or update on application launch instead?

Note on proxy servers: a proxy server for Internet access means the machine does not have direct Internet access, but must access the Internet via a machine dedicated as a "gateway". Back in the day I used to "discover" the proxy settings by reading IE settings, but overall: don't assume direct Internet access is available.


出于可靠性原因,设置不应执行诸如此类的复杂操作。 您可以在您的应用程序中执行此操作吗? 然后您将处于一个更可预测的模拟上下文中,具有完全的 Internet 访问权限和用户交互activity - 如果需要的话。更可靠,更易于调试,并且您可以与用户进行交互 activity 来解决连接问题。如果一开始失败了,您可以重试多次。相比之下,设置是“一次性”——而且更难调试。

请记住,大多数企业部署都是在静默安装模式下完成的。当在 静默模式 中设置 运行s 时,您必须抑制所有可能需要 Internet 访问或某种形式的 interactivity 的奇特功能。从设置中访问 Internet 是一种 反模式 - 至少目前如此 - 未来的在线部署技术可能会改变这一事实。但是,在静默的公司安装过程中,您的设置可能会 运行 在 系统上下文 中根本无法访问互联网(SYSTEM 帐户无法访问互联网 - 除非网络设置疯了)。您还可能在尝试连接时导致崩溃并触发异常,并且您还可能触发 安全软件干扰 - 它发生在“ 异常设置行为 ".

即使用户 运行 使用适当的用户上下文设置您的设置,也可能有一个 代理服务器 您必须使用它访问网络 - 然后除非您从系统中检索代理设置,否则您的连接仍然会失败。我从来没有在设置中这样做过 - 同样,因为在我看来设置不应该需要 Internet 访问。

请记住,.NET 框架在所有 OS 版本的所有“通用版本”中仍然不可用。

希望这对您有意义。 请将此功能添加到您的应用程序中。一旦操作具有 运行 标记注册表 - 如果它应该 运行 一次。如果您在那里打开一些 ACL 以允许任何人写标志,您甚至可以写信给 HKLM。


更新:缩短摘要。在以下情况下,在您的设置中执行此操作将失败:

  1. .NET 框架丢失、禁用或版本错误
    • 问题越来越少,但仍时有遗漏
  2. Internet 访问需要 Internet 代理
  3. 使用延迟模式 CA(用于 read/write 系统访问)(不允许 Internet 访问)
  4. 通过分发系统进行静默安装(应该不允许 Internet 访问)
  5. 交互式静默安装(很可能失败,视情况而定)
  6. 可能受到安全软件的干扰(异常设置 activity)。
    • 防病毒/恶意软件保护
    • 防火墙(阻止 msiexec.exe)
  7. GUI 要求?您是否从控制台应用程序中尝试 运行ning 组件?
  1. 记录您的 MSI。

  2. 在您的自定义操作中提供日志记录。 MSI 不知道它在做什么,所以您需要记录、记录、记录。

  3. 读取 MSI 日志。

我不怀疑缺少 .NET,因为 try catch 不会有任何区别,因为 CLR 永远不会启动。我怀疑您会发现 HttpClient 出现错误,表明无法连接远程主机。

可能它与代理相关。 Internet 连接在任何安装程序上下文中都不是普遍可用的(否则网络下载和网络下载静默安装程序将如何工作????)但这也不是一件确定的事情。每个客户/站点/机器可能不同,因此您可能无法通过。

我会将此类互动视为 "best effort"。首先在直接上下文中尝试它(可能 运行 作为模拟启动用户并获得他们的代理访问权限),如果这不起作用尝试 运行 作为延迟上下文到 运行 作为 SYSTEM看看它是否有访问权限。无论哪种方式,请尝试|捕获|记录错误并继续。不要阻止安装。