我正在尝试采用安装网站的现有 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/