在安装Web应用程序IIS期间添加脚本映射

时间:2013-02-20 10:54:34

标签: iis wix

是否有人成功将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错误,当我在安装应用程序后手动添加脚本映射时,它运行得很好。如果有人能分享他们是如何做到的,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

看看WebApplicationExtension元素。

答案 1 :(得分:1)

我们正在C#中编写一个单独的自定义操作,并在安装Finalize后安排它以添加处理程序。

试试这个,您可以使用自己的自定义操作执行任何操作。

答案 2 :(得分: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>

IIS 6上需要CheckPath="no",因为我们使用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”结尾的网址 - 我只是从您的代码中复制了它但不确定您是故意这样做还是仅仅是从example复制了微软网站。即使处理程序已成功注册,也可能导致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" />

有关详细信息,请阅读this tutorial