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



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

  <CustomAction Id="AddHandlers_Cmd" Property="AddHandlers" Value="&quot;[SystemFolder]inetsrvappcmd&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个错误,当我在安装应用程序后手动添加脚本映射时,它可以完美地工作。如果有人能分享他们是如何做到这一点的,我将不胜感激。

听起来您需要向web应用程序添加处理程序映射。如果是这样的话,那么您就不需要自定义操作来实现这一点。

看看WebApplicationExtension元素。

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

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

我没有使用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.30319aspnet_isapi.dll" Description="ASP.NET v4.0.30319"/>
</Component>

为了将这些添加到具体的站点,您需要使用WebApplicationExtension,正如@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.30319aspnet_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]inetsrvappcmd.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" />

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

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

更新2:

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

<CustomAction Id="AddGsoapHandler" Directory="TARGETDIR" Impersonate="no" Execute="deferred" Return="check" ExeCommand="[SystemFolder]inetsrvappcmd.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" />

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

最新更新