我正在使用WiX为ASP.Net网站创建安装程序。如何使用WiX在IIS中设置ASP.Net版本?
答案 0 :(得分:22)
我们用这个:
首先从注册表中确定.Net框架根目录:
<Property Id="FRAMEWORKROOT">
<RegistrySearch Id="FrameworkRootDir" Root="HKLM"
Key="SOFTWARE\Microsoft\.NETFramework"
Type="directory" Name="InstallRoot" />
</Property>
然后,在IIS中安装网站的组件内部:
<!-- Create and configure the virtual directory and application. -->
<Component Id='WebVirtualDirComponent' Guid='{GUID}' Permanent='no'>
<iis:WebVirtualDir Id='WebVirtualDir' Alias='YourAlias' Directory='InstallDir' WebSite='DefaultWebSite' DirProperties='DirProperties'>
<iis:WebApplication Id='WebApplication' Name='YourAppName' WebAppPool='AppPool'>
<!-- Required to run the application under the .net 2.0 framework -->
<iis:WebApplicationExtension Extension="config" CheckPath="yes" Script="yes"
Executable="[FRAMEWORKROOT]v2.0.50727\aspnet_isapi.dll" Verbs="GET,HEAD,POST" />
<iis:WebApplicationExtension Extension="resx" CheckPath="yes" Script="yes"
Executable="[FRAMEWORKROOT]v2.0.50727\aspnet_isapi.dll" Verbs="GET,HEAD,POST" />
<iis:WebApplicationExtension Extension="svc" CheckPath="no" Script="yes"
Executable="[FRAMEWORKROOT]v2.0.50727\aspnet_isapi.dll" Verbs="GET,HEAD,POST" />
</iis:WebApplication>
</iis:WebVirtualDir>
</Component>
对于x64安装程序(这是重要的) 将Win64 ='yes'添加到注册表搜索中,因为64位计算机上的32位环境具有不同的注册表配置单元(以及不同的frameworkroot)
<RegistrySearch Id="FrameworkRootDir" Root="HKLM"
Key="SOFTWARE\Microsoft\.NETFramework"
Type="directory"
Name="InstallRoot" Win64='yes' />
答案 1 :(得分:13)
在与它搏斗之后,这对我有用:
<Property Id="FRAMEWORKBASEPATH">
<RegistrySearch Id="FindFrameworkDir" Root="HKLM" Key="SOFTWARE\Microsoft\.NETFramework" Name="InstallRoot" Type="raw"/>
</Property>
<Property Id="ASPNETREGIIS" >
<DirectorySearch Path="[FRAMEWORKBASEPATH]" Depth="4" Id="FindAspNetRegIis">
<FileSearch Name="aspnet_regiis.exe" MinVersion="2.0.5"/>
</DirectorySearch>
</Property>
<CustomAction Id="MakeWepApp20" Directory="TARGETDIR" ExeCommand="[ASPNETREGIIS] -norestart -s W3SVC/[WEBSITEID]/ROOT/[VIRTUALDIR]" Return="check"/>
<InstallExecuteSequence>
<Custom Action="MakeWepApp20" After="InstallFinalize">ASPNETREGIIS AND NOT Installed</Custom>
</InstallExecuteSequence>
[WEBSITEID]和[VIRTUALDIR]是您必须自己定义的属性。只有在为应用程序而不是整个网站设置ASP.NET版本时,才需要[VIRTUALDIR]。
自定义操作的排序至关重要。在InstallFinalize之前执行它会导致它失败,因为Web应用程序在此之后才可用。
感谢Chris Burrows找到aspnet_regiis可执行文件的正确示例(Google“使用WIX保护连接字符串”)。
JB
答案 2 :(得分:5)
不要忘记在服务器上启用ASP 2.0
<iis:WebServiceExtension Id="ExtensionASP2" Group="ASP.NET v2.0.50727" Allow="yes" File="[NETFRAMEWORK20INSTALLROOTDIR]aspnet_isapi.dll" Description="ASP.NET v2.0.50727"/>
答案 3 :(得分:4)
我的回答与其他人看到的基本相同;我只是想给人们另一个例子。
考虑到ASP.NET处理的文件扩展名的数量,以及每个版本中列表的更改,我认为最可靠的解决方案是在安装结束时运行aspnet_regiis
。但这确实意味着,我不支持回滚或卸载。我在IIS中创建一个新的应用程序,它并不重要,因为它将被Wix删除。如果您正在修改现有应用程序,也许您可以从注册表中找到配置的ASP.NET版本,并运行该版本的aspnet_regiis
来撤消您的更改。
以下使用Wix 3.5。
<Fragment>
<!-- Use the properties in Wix instead of doing your own registry search. -->
<PropertyRef Id="IISMAJORVERSION"/>
<PropertyRef Id="NETFRAMEWORK40FULL"/>
<PropertyRef Id="NETFRAMEWORK40FULLINSTALLROOTDIR"/>
<!-- The code I'm using is intended for IIS6 and above, and it needs .NET 4 to be
installed. -->
<Condition Message="This application requires the .NET Framework 4.0. Please install the required version of the .NET Framework, then run this installer again.">
<![CDATA[Installed OR (NETFRAMEWORK40FULL)]]>
</Condition>
<Condition Message="This application requires Windows Server 2003 and Internet Information Services 6.0 or better.">
<![CDATA[Installed OR (VersionNT >= 502)]]>
</Condition>
<!-- Populates the command line for CAQuietExec. IISWEBSITEID and IISVDIRNAME
could be set to default values, passed in by the user, or set in your installer's
UI. -->
<CustomAction Id="ConfigureIis60AspNetCommand" Property="ConfigureIis60AspNet"
Execute="immediate"
Value=""[NETFRAMEWORK40FULLINSTALLROOTDIR]aspnet_regiis.exe" -norestart -s "W3SVC/[IISWEBSITEID]/ROOT/[IISVDIRNAME]"" />
<CustomAction Id="ConfigureIis60AspNet" BinaryKey="WixCA" DllEntry="CAQuietExec"
Execute="deferred" Return="check" Impersonate="no"/>
<InstallExecuteSequence>
<Custom Action="ConfigureIis60AspNetCommand" After="CostFinalize"/>
<!-- Runs the aspnet_regiis command immediately after Wix configures IIS.
The condition shown here assumes you have a selectable feature in your
installer with the ID "WebAppFeature" that contains your web components. The
command will not be run if that feature is not being installed, or if IIS is
not version 6. It *will* run if the application is being repaired.
SKIPCONFIGUREIIS is a property defined by Wix that causes it to skip the IIS
configuration. -->
<Custom Action="ConfigureIis60AspNet" After="ConfigureIIs" Overridable="yes">
<![CDATA[((&WebAppFeature = 3) OR (REINSTALL AND (!WebAppFeature = 3)))
AND (NOT SKIPCONFIGUREIIS) AND (IISMAJORVERSION = "#6")]]>
</Custom>
</InstallExecuteSequence>
<UI>
<ProgressText Action="ConfigureIis60AspNetCommand"
>Configuring ASP.NET</ProgressText>
<ProgressText Action="ConfigureIis60AspNet"
>Configuring ASP.NET</ProgressText>
</UI>
</Fragment>
答案 4 :(得分:3)
这有点简单。我不知道这是否适用于更新现有的AppPool,但适用于创建APP池和设置.NET版本。
<iis:WebServiceExtension Id="AMS_AppPool" Name="AccountManagementSVC1" Identity="other" ManagedPipelineMode="integrated" ManagedRuntimeVersion="v4.0" User="AMS_AppPoolUser" RecycleMinutes="120" />
答案 5 :(得分:1)
我通过使用WiX WebApplicationExtension找到了一种不同的方式。您可以查看完整的解决方案here和here。
到目前为止,我喜欢Wix,但是男人需要花很多时间去寻找你想要的东西。
答案 6 :(得分:0)
首先找到正确的.NET版本文件夹。使用DirectorySearch / FileSearch执行搜索。
使用上述路径调用aspnet_regiis.exe并从自定义操作中设置webapp的版本。
aspnet_regiis.exe -s W3SVC/1/ROOT/SampleApp1