3

有没有人成功地将 IIS 脚本映射添加到他们的 Wix 安装中。我一直在使用这个:

  <CustomAction Id="AddHandlers_Cmd" Property="AddHandlers" Value="&quot;[SystemFolder]inetsrv\appcmd&quot; set config -section:system.webServer/handlers /+&quot;[\[]name='GSOAP',path='*.dll', verb='*',modules='IsapiModule',scriptProcessor='[BIN]mod_gsoap.dll',resourceType='File', requireAccess='Execute'[\]]&quot;" Execute="immediate"/>
  <CustomAction Id="AddHandlers" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>

但是,我从我的 Web 应用程序中收到 404 错误,并且当我在安装应用程序后手动添加脚本映射时,它可以完美运行。如果有人能分享他们是如何做到这一点的,我将不胜感激。

4

3 回答 3

1

听起来您需要将处理程序映射添加到您的 Web 应用程序。如果是这种情况,那么您不需要自定义操作来完成此操作。

看看WebApplicationExtension元素。

于 2013-04-08T10:33:05.507 回答
1

我们正在用 C# 编写一个单独的自定义操作,并在安装完成后将其调度以添加处理程序。

试试这个,你可以用你自己的自定义动作做任何事情。

于 2013-04-10T05:50:52.497 回答
0

我没有使用 GSOAP 处理程序,但使用了 ASP.NET ISAPI 扩展。我想基本上它具有相同的集成水平。我将发布 ASP.NET 的代码,希望您将其更改为 GSOAP 不会有问题。我很可能会错误地更改某些内容并使示例对您无法使用,因此我让您做得更好。

如果不是,这是我注册扩展本身的代码

<Component Id="Iis6ConfigExtentions" Guid="{GuidHash({ProductId}-1822E4F3-5850-47D5-9281-D1E0E20C77D4)}" KeyPath="yes" Permanent="yes">
    <Condition><![CDATA[Installed OR (IISMAJORVERSION AND (IISMAJORVERSION = "#6"))]]></Condition>
    <iis:WebServiceExtension Id="ExtensionASP4" Group="ASP.NET v4.0.30319" Allow="yes" File="[FRAMEWORKROOT]v4.0.30319\aspnet_isapi.dll" Description="ASP.NET v4.0.30319"/>
</Component>

并且要将它们添加到您需要使用 WebApplicationExtention 的具体站点,正如@Yan 已经提到的:

<iis:WebApplication Id="IIS6WebApp" Name="[SITE_APP_NAME]" WebAppPool="AppPool" >
  <iis:WebApplicationExtension Verbs="GET,HEAD,POST" CheckPath="no" Script="yes" Executable="[FRAMEWORKROOT]v4.0.30319\aspnet_isapi.dll" />
</iis:WebApplication>

CheckPath="no"IIS 6 上是必需的,因为我们使用 ASP.NET MVC,它不会将 url 映射到磁盘上的文件。您可能也需要它,因为服务地址可能不会映射到物理文件。

更新:

看起来真的不可能直接在 WIX 中完成(至少在 3.5 版本中)。您正朝着正确的方向前进 - 使用 appcmd 进行自定义操作。但是提供的自定义操作不完整或您需要什么:第一个只是将属性值设置为您需要执行的命令,第二个调用一些未提供的 Dll 自定义操作。

我要尝试执行的是:

<CustomAction Id="AddGsoapHandler" Directory="TARGETDIR" Impersonate="no" Execute="deferred" Return="check" ExeCommand="[SystemFolder]inetsrv\appcmd.exe set config -section:system.webServer/handlers /+&quot;[\[]name='GSOAP',path='*.dll', verb='*',modules='IsapiModule',scriptProcessor='[BIN]mod_gsoap.dll',resourceType='File', requireAccess='Execute'[\]]&quot; /commit:apphost" />

请注意您的处理程序配置的路径属性。它会将处理程序的使用限制为仅以“.dll”结尾的 URL - 我只是从您的代码中复制了它,但不确定您是故意这样做还是只是从Microsoft 站点的示例中复制。即使处理程序注册成功,这也可能导致 401 错误。

我还添加了/commit:apphost论点。不确定你是否真的需要这个,但我用它来明确指定我需要配置我的应用程序的配置。

更新 2:

如果您需要将配置设置为仅单个应用程序,则应将应用程序对象指定为 appcmd 的参数,而不是表示全局配置的 'config'。请试试这个:

<CustomAction Id="AddGsoapHandler" Directory="TARGETDIR" Impersonate="no" Execute="deferred" Return="check" ExeCommand="[SystemFolder]inetsrv\appcmd.exe set app "MySite/app1" -section:system.webServer/handlers /+&quot;[\[]name='GSOAP',path='*.dll', verb='*',modules='IsapiModule',scriptProcessor='[BIN]mod_gsoap.dll',resourceType='File', requireAccess='Execute'[\]]&quot; /commit:apphost" />

有关更多详细信息,您可以阅读本教程

于 2013-04-10T15:53:11.577 回答