【问题标题】:Stop AppPool before installing website with WiX在使用 WiX 安装网站之前停止 AppPool
【发布时间】:2017-01-10 21:24:00
【问题描述】:

我正在尝试采用现有的 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]:执行操作:StopIisAppPoolCMD

动作 14:43:48:StopIisAppPoolCMD。

动作开始时间 14:43:48:StopIisAppPoolCMD。

MSI (s) (94:A8) [14:43:48:834]:属性更改:添加 StopIisAppPool 属性。它的值是'"C:\WINDOWS\SysNative\inetsrv\appcmd.exe" stop apppool /apppool.name:"MyWebAppPool"'。

操作于 14:43:48 结束:StopIisAppPoolCMD。返回值 1。

MSI (s) (94:A8) [14:43:48:834]:执行操作:StopIisAppPool

行动 14:43:48:StopIisAppPool。

动作开始时间 14:43:48:StopIisAppPool。

MSI (s) (94:2C) [14:43:48:837]:调用远程自定义操作。 DLL:C:\WINDOWS\Installer\MSI2B0E.tmp,入口点:CAQuietExec64

CAQuietExec64:错误 0x80070057:无法获取命令行数据

CAQuietExec64:错误 0x80070057:无法获取命令行

CustomAction StopIisAppPool 返回实际错误代码 1603(请注意,如果翻译发生在沙箱内,这可能不是 100% 准确)

操作于 14:43:48 结束:StopIisAppPool。返回值 3。

行动于 14:43:48 结束:安装。返回值 3。

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

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

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

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

【问题讨论】:

    标签: iis wix custom-action wix3.9


    【解决方案1】:

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

    【讨论】:

    • 我同意这应该不是问题,但是某些文件被锁定,因为当我运行安装程序时,它会发出文件正在使用警告,如果我关闭应用程序池,那么问题就会出现离开。也许我们需要清理其他东西而不是试图解决这个问题。我认为这可能是因为我们使用的是本机 dll,而且我知道由于我们使用的是本机 dll,我们在卷影复制方面遇到了一些问题。
    • 今天再看一些,我认为问题是因为我试图通过安装程序在 IIS 上配置 ASP.NET 应用程序。因此,每次我进行安装时,它都会尝试卸载并重新安装 ASP.NET 应用程序和 Web 应用程序池。我认为是应用程序或网络应用程序池被视为“正在使用”并在安装期间导致弹出窗口。
    【解决方案2】:

    根据 WiX 文档页面 Quiet Execution Custom Action(在“立即执行”标题下),如果您的 QuietExec 自定义操作设置为 Execute="immediate",则需要在使用 CAQuietExec 时设置一个名为 QtExecCmdLine 的属性或WixQuietExecCmdLine 使用 WixQuietExec 时(而不是设置名称为自定义操作 ID 的属性;该方法仅在您的自定义操作被延迟时使用)。

    这是对我有用的代码(他们建议您使用较新的 WixQuietExec 而不是 CAQuietExec):

    <CustomAction Id="StopApplicationPool_Cmd" Property="WixQuietExecCmdLine" Value="&quot;[SystemFolder]inetsrv\appcmd&quot; stop apppool MyApp" Execute="immediate" />
    <CustomAction Id="StopApplicationPool" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="check" Impersonate="no" />
    <CustomAction Id="StartApplicationPool_Cmd" Property="WixQuietExecCmdLine" Value="&quot;[SystemFolder]inetsrv\appcmd&quot; start apppool MyApp" Execute="immediate" />
    <CustomAction Id="StartApplicationPool" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="check" Impersonate="no" />
    

    这样安排:

    <InstallExecuteSequence>
    ...
      <Custom Action="StopApplicationPool_Cmd" Before="StopApplicationPool"><![CDATA[REMOVE OR UPGRADEFOUND OR UPGRADINGPRODUCTCODE OR REINSTALL]]></Custom>
      <Custom Action="StopApplicationPool" Before="InstallValidate"><![CDATA[REMOVE OR UPGRADEFOUND OR UPGRADINGPRODUCTCODE OR REINSTALL]]></Custom>
    ...
      <Custom Action="StartApplicationPool_Cmd" After="InstallFinalize"><![CDATA[UPGRADEFOUND OR UPGRADINGPRODUCTCODE OR REINSTALL]]></Custom>
      <Custom Action="StartApplicationPool" After="StartApplicationPool_Cmd"><![CDATA[UPGRADEFOUND OR UPGRADINGPRODUCTCODE OR REINSTALL]]></Custom>
    
    ...
    </InstallExecuteSequence>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2017-01-23
      相关资源
      最近更新 更多