我没有使用 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 /+"[\[]name='GSOAP',path='*.dll', verb='*',modules='IsapiModule',scriptProcessor='[BIN]mod_gsoap.dll',resourceType='File', requireAccess='Execute'[\]]" /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 /+"[\[]name='GSOAP',path='*.dll', verb='*',modules='IsapiModule',scriptProcessor='[BIN]mod_gsoap.dll',resourceType='File', requireAccess='Execute'[\]]" /commit:apphost" />
有关更多详细信息,您可以阅读本教程。