如何使用Wix在IIS 7上安装ASP.Net MVC应用程序?

15

对于IIS6,我可以使用Wix中的IIS助手来安装Web应用程序,如下所示:

<iis:WebAppPool 
    Id="AP_MyApp" 
    Name="My Application Pool" 
    Identity="networkService" />
<iis:WebApplication 
    Id="WA_MyApp" 
    Name="MyApp" 
    WebAppPool="AP_MyApp">
    <iis:WebApplicationExtension
        CheckPath="no"
        Executable="[NETFRAMEWORK20INSTALLROOTDIR]aspnet_isapi.dll"
        Verbs="GET,HEAD,POST"/>
</iis:WebApplication>

很遗憾,这种方法不适用于IIS7。我们不想使用aspnet_isapi.dll机制,而是希望集成的管道处理请求路由。该脚本创建的应用程序池处于Classic模式而不是Integrated模式,因此没有任何处理程序能够正确运行。

我该如何在IIS 7上正确安装MVC应用程序?


很遗憾,IIS扩展目前还不被IIS7支持。 - alexn
3个回答

11
我个人建议使用AppCmd.exe(matthewthurlow的第一个方法),因为您不必依赖于已安装的传统管理组件,也不必冒着手动修改配置XML的风险。如果您对AppCmd不熟悉,Mike Volodarsky有一篇很棒的文章Getting Started with AppCmd.exe,而Microsoft IIS Configuration Reference则非常出色,提供了UI、代码和AppCmd示例,用于修改每个配置项(例如Application Pools)。IIS7 Administration Pack还包括一个配置编辑器,允许您从任何现有配置生成AppCmd脚本。要将AppCmd集成到WiX中,您需要为每个命令创建和安排两个自定义操作。WiX v3手册中有一般信息记录此过程,下面我会提供一个具体的示例。首先,您需要设置一个立即操作,将命令行存储在属性中:
<CustomAction 
  Id="CreateAppPool_Cmd" 
  Property="CreateAppPool" 
  Execute="immediate" 
  Value="&quot;[WindowsFolder]system32\inetsrv\APPCMD.EXE&quot; add apppool /name:&quot;[APP_POOL_NAME]&quot;" /> 

接下来,您需要设置一个延迟操作,该操作引用此属性:

<CustomAction 
  Id="CreateAppPool" 
  BinaryKey="WixCA" 
  DllEntry="CAQuietExec" 
  Execute="deferred" 
  Return="ignore" 
  Impersonate="no"/> 

最后,您需要安排这些内容。在InstallFinalize之后设置属性的立即操作似乎很有效,而延迟操作在InstallFiles之后起作用。我还没有弄清楚回滚操作。MapGuide Open Source广泛使用此方法;您可以在我们的MapGuide.wxs文件中看到CA调度,并在我们的IIS7.wxs文件中查看CA定义。

这对我昨天非常有用,还感谢您提供的示例链接! - Simon Steele

4

感谢@matthewthurlow,我能够使用XML工具实现我需要做的事情:

<util:XmlFile 
    Id="ModifyAppPoolPipelineType"
    Action="setValue"
    ElementPath="//configuration/system.applicationHost/applicationPools/add[\[]@name='My Application Pool'[\]]/@managedPipelineMode"
    File="[WindowsFolder]System32\inetsrv\config\applicationHost.config"
    Value="Integrated"/>

其他操作似乎在IIS 7上运行良好。

2
WIX的IIS扩展不支持IIS7。IIS团队在版本之间一直在重写元数据。有很多东西无法正常工作,其中包括缺乏集成应用程序池。

在这些扩展被重写之前,您有三个选择:

  • 使用内置的自定义操作来调用appcmd.exe
  • 使用XmlConfig更新applicationHost.config
  • 编写自己的自定义操作

我目前选择了xmlconfig选项,因为您可以在组件内执行此操作并将其绑定到功能。


这并不完全正确。Mike已经做了很多工作,以便通过现有的CustomActions支持IIS7。不幸的是,该代码仅支持“传统”的内容。如上所述,集成管道需要自定义代码。 - Rob Mensching
1
好的 - 我不知道有支持IIS7的工作正在进行中 - 我看到了一条评论,表明Apache的支持可能会更快些 :p我原来以为只需要打开IIS6元数据兼容性就可以了。听到这个消息很好。 - matthewthurlow
1
要清楚的是,你仍然需要IIS6元数据库兼容性,但至少应该可以工作。那是我对于IIS感到恼火时的随口一说。 - Rob Mensching
2
这在IIS7.5中仍然适用吗? - Terrance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接