iis - 在使用 WiX 安装网站之前停止 AppPool

标签 iis wix custom-action wix3.9

我正在尝试采用安装网站的现有 MSI 并将其添加到停止 AppPool 的过程中,以便在安装更新时您不必记住在运行安装程序之前停止 AppPool。

下面列出了我设置的自定义操作

<CustomAction Id='StopIisAppPoolCMD'
          Property='StopIisAppPool'
          Value='"[WindowsFolder]SysNative\inetsrv\appcmd.exe" stop apppool /apppool.name:"[WEB_APP_POOL_NAME]"'
          Execute='immediate' />
<CustomAction Id='StopIisAppPool'
          BinaryKey='WixCA'
          DllEntry='CAQuietExec64'
          Execute='immediate'
          Return='check' />

它们在 msi 产品中的安排如下:

<InstallExecuteSequence>
  ...
  <Custom Action="StopIisAppPool" Before="InstallValidate"></Custom>
  <Custom Action="StopIisAppPoolCMD" Before="StopIisAppPool"></Custom>
  ...
</InstallExecuteSequence>

msi 被包裹在一个像这样的包中:

<Chain>
  ...
  <MsiPackage Name="MySetup.msi" DisplayInternalUI="yes"/>
</Chain>

执行自定义操作时,我会在 msi 日志中看到此信息

MSI (s) (94:A8) [14:43:48:833]: Doing action: StopIisAppPoolCMD

Action 14:43:48: StopIisAppPoolCMD.

Action start 14:43:48: StopIisAppPoolCMD.

MSI (s) (94:A8) [14:43:48:834]: PROPERTY CHANGE: Adding StopIisAppPool property. Its value is '"C:\WINDOWS\SysNative\inetsrv\appcmd.exe" stop apppool /apppool.name:"MyWebAppPool"'.

Action ended 14:43:48: StopIisAppPoolCMD. Return value 1.

MSI (s) (94:A8) [14:43:48:834]: Doing action: StopIisAppPool

Action 14:43:48: StopIisAppPool.

Action start 14:43:48: StopIisAppPool.

MSI (s) (94:2C) [14:43:48:837]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSI2B0E.tmp, Entrypoint: CAQuietExec64

CAQuietExec64: Error 0x80070057: failed to get command line data

CAQuietExec64: Error 0x80070057: failed to get Command Line

CustomAction StopIisAppPool returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)

Action ended 14:43:48: StopIisAppPool. Return value 3.

Action ended 14:43:48: INSTALL. Return value 3.

我觉得我的问题可能是因为我尝试执行 Execute='immediate' 而不是 deferred,但如果我将自定义操作运行为 deferred,那么它必须在 InstallInitialize 之后运行,这已经来不及停止 AppPool 以避免文件使用冲突。

我认为可以立即运行,因为msi被包装在WiX bundle 中,所以我假设它会在InstallInitialize之前以提升的权限运行因为我必须在 msi 安装程序启动之前输入管理员密码。

我考虑过将这些操作放在 bundle 中的单独 msi 或 exe 包中,并在安装 Web 文件的 msi 之前运行它,但我真的不想这样做,因为 Web 应用程序池名称是从 UI 中检索的msi 已经存在,如果我可以避免它,我宁愿不必重做 UI 的处理方式。

有没有更简单的方法来解决这个问题?我错过了一些简单的事情吗?或者我真的需要重做 UI 并将这些操作拆分到 bundle 内的单独 exe 包或 msi 中吗?如果是这种情况,我可能会说忘记它,并确保每个人都知道在安装任何新版本之前手动停止应用程序池。

最佳答案

我在安装之前从未需要停止应用程序池。 ASP.NET 用完临时目录并且不存在任何文件锁定问题。此外,当 web.config 被触及时,IIS 会自动回收应用程序池,因此所有这些都应该不是问题。

关于iis - 在使用 WiX 安装网站之前停止 AppPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578682/

相关文章:

WIX:将文件复制到另一个分区中的自定义目录

.net - 在 MAC OS 上安装 WIX 工具集并创建 MSI

java - 记录自定义操作事件 Liferay - 用户添加+删除

WiX:无法处理 "Launch an application after install"复选框 = 0

c++ - SHFileOperation 无法删除文件夹

使用属性值的 WIX 自定义操作条件不起作用

windows - 将 IIS 设置克隆到新服务器的最佳方法?

asp.net - URL 映射适用于本地主机,但不适用于 asp.net 中的生产服务器

iis - 无法从自托管的 nuget 服务器下载包(404 错误)

c# - IIS 花费大量时间来交付第一个 javascript 和图像文件