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

Asp.net mvc 如何使用Wix在IIS 7上安装ASP.Net MVC应用程序?,asp.net-mvc,iis,iis-7,wix,Asp.net Mvc,Iis,Iis 7,Wix,对于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:Web

对于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机制,而是希望使用集成管道来处理请求路由。此脚本创建的应用程序池处于经典模式而非集成模式,因此所有处理程序都无法正确运行


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

WIX的IIS扩展不支持IIS7。IIS团队在版本之间不断重写元数据库。有相当多的事情不起作用,其中缺乏一个集成的应用程序池

在重写扩展之前,您只有三个选项:

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

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

多亏了@matthewturlow,我才能够使用XML UTIL实现我需要做的事情:

<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配合得很好。

我个人建议使用AppCmd.exe(Matthewturlow的第一个项目符号),因为您不必依赖正在安装的旧版管理组件,也不必冒手动修改配置XML的风险

如果您对AppCmd不满意,Mike Volodarsky有一篇关于AppCmd的文章,Microsoft非常优秀,它提供了修改每个配置项(例如)的UI、代码和AppCmd示例。还包括一个配置编辑器,允许您从任何现有配置中删除

要将AppCmd集成到WiX中,需要为每个命令创建并计划两个自定义操作。wixv3手册中有一般信息,下面我提供了一个具体的示例

首先,您需要设置一个立即操作以将命令行存储在属性中:

<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"/> 

接下来,设置一个引用此属性的延迟操作:

<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开源广泛使用这种方法;您可以在我们的文件中看到CA调度,在我们的文件中看到CA定义。

这不完全正确。Mike做了大量工作,以使IIS7得到现有CustomActions的支持。不幸的是,代码只支持“遗留”内容。如上所述,集成管线需要自定义代码。好的-我不知道正在进行支持IIS7的工作-我看到一条评论,建议Apache支持可能会更快:p我的印象是,如果打开IIS6元数据库兼容性,一些东西就可以工作了,就是这样。很高兴听到。说清楚,您仍然需要IIS6元数据库的兼容性,但至少它应该可以工作。当我对IIS感到愤怒时,这是我的即时评论。IIS7.5仍然是这样吗?这对我昨天非常有用,也感谢链接到示例!不幸的是,IIS7还不支持IIS扩展。