2008-10-02 7 views

Répondre

22

Nous utilisons ceci:

d'abord déterminer le framework .Net répertoire racine du Registre:

<Property Id="FRAMEWORKROOT"> 
    <RegistrySearch Id="FrameworkRootDir" Root="HKLM" 
       Key="SOFTWARE\Microsoft\.NETFramework" 
       Type="directory" Name="InstallRoot" /> 
</Property> 

Ensuite, à l'intérieur du composant qui installe votre site Web dans 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> 

Pour un programme d'installation x64 (CECI EST IMPORTANT) Ajoutez Win64 = 'oui' à la recherche de registre, car les 32 bits environnement sur une machine 64 bits a une autre ruche de Registre (et un autre frameworkroot)

<RegistrySearch Id="FrameworkRootDir" Root="HKLM" 
     Key="SOFTWARE\Microsoft\.NETFramework" 
     Type="directory" 
     Name="InstallRoot" Win64='yes' /> 
+1

wow. super-héros. Merci! –

+0

@thjis: Pourquoi inscrivez-vous seulement ces trois extensions? Devez-vous également enregistrer, par exemple, les extensions aspx et asmx? Si vous aller de l'avant un registre toutes les extensions listées dans IIS juste pour être sûr? – Ian

+0

@ian: Nous en avions seulement besoin, vous pouvez enregistrer toutes les extensions dont vous avez besoin. – thijs

0
  • Recherchez d'abord le dossier de version .NET correct. Utilisez DirectorySearch/FileSearch pour effectuer une recherche.

  • Utilisez le chemin ci-dessus pour appeler aspnet_regiis.exe et définir la version pour la webapp à partir d'une action personnalisée.

    aspnet_regiis.exe -s W3SVC/1/ROOT/SampleApp1

+0

Le "1" dans ce chemin est problématique. C'est un identifiant de site. Si vous avez plusieurs sites Web sur l'installation IIS, le site que vous souhaitez peut avoir un nombre différent et, si tel est le cas, cette commande ne l'affectera pas, mais modifiera un site non lié à la place. Plus de détails à http://weblogs.asp.net/owscott/archive/2006/05/30/ASPNet_5F00_regiis.exe-tool_2C00_-setting-the-default-version-without-forcing-an-upgrade-on- all-sites.aspx – Anthony

1

J'ai trouvé une autre façon en utilisant le WiX WebApplicationExtension. Vous pouvez consulter la solution complète here et here. J'aime Wix jusqu'ici, mais l'homme fait beaucoup de creuser pour trouver ce que vous cherchez.

+0

J'ai essayé cette approche avec mon application MVC et ça ne fonctionnerait pas bien du tout. L'utilisation de aspnet_regiis dans une CustomAction pour changer l'AppPool en .NET 2.0 a fonctionné pour moi (voir la réponse de John Burns). – Jason

13

Voici ce qui a fonctionné pour moi après avoir lutté avec elle:

<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] et [VirtualDir] sont propriétés que vous devez définir vous-même. [VIRTUALDIR] n'est nécessaire que si vous définissez la version ASP.NET pour une application plutôt qu'un site Web entier.

Le séquencement de l'action personnalisée est critique. L'exécuter avant InstallFinalize l'amènera à échouer car l'application Web n'est pas disponible avant cela.

Merci à Chris Burrows pour un bon exemple de recherche de l'exécutable aspnet_regiis (Google "Utiliser WIX pour sécuriser une chaîne de connexion").

jb

+1

Merci mon ami, à mon avis c'est la réponse la plus cohérente ici. J'ai essayé l'autre suggestion (qui laisse le pool d'applications comme .NET 1.1) et c'était juste trop compliqué et ne fonctionnait pas sur mon application MVC. Un point, j'ai dû utiliser l'attribut LongName pour FileSearch (au lieu de Name dont il se plaignait ne supporte que le format 8.3). Merci encore. – Jason

+0

Désolé, que serait l'ExeCommand pour le paramétrer pour l'ensemble du site? –

+0

De même, [SITE WEB] correspondrait-il à ? –

5

Ne pas oublier d'activer ASP 2.0 sur le serveur

<iis:WebServiceExtension Id="ExtensionASP2" Group="ASP.NET v2.0.50727" Allow="yes" File="[NETFRAMEWORK20INSTALLROOTDIR]aspnet_isapi.dll" Description="ASP.NET v2.0.50727"/> 

Here is the sof-question

+0

où référencez-vous cet Id après? – BozoJoe

+0

Nulle part, le trou "iis: WebServiceExtension" -tag est à l'intérieur d'une balise de composant. Voilà comment il est référencé. L'identifiant n'est pas utilisé ailleurs. – uli78

3

Ma réponse est fondamentalement la même chose que d'autres vues ici; Je voulais juste offrir aux gens un autre exemple. Étant donné le nombre d'extensions de fichiers qu'ASP.NET gère et que la liste change dans chaque version, je pense que la solution la plus fiable consiste à exécuter aspnet_regiis à la fin de l'installation. Cela signifie cependant que je n'ai aucun support pour la restauration ou la désinstallation.Si vous créez une nouvelle application dans IIS, cela n'a pas vraiment d'importance car elle sera supprimée par Wix. Si vous modifiez une application existante, vous pourriez peut-être savoir à partir du registre quelle version d'ASP.NET est configurée et exécuter le aspnet_regiis de cette version pour annuler vos modifications.

Ce qui suit utilise 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="&quot;[NETFRAMEWORK40FULLINSTALLROOTDIR]aspnet_regiis.exe&quot; -norestart -s &quot;W3SVC/[IISWEBSITEID]/ROOT/[IISVDIRNAME]&quot;" /> 
    <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> 
3

Ceci est un peu plus simple. Je ne sais pas si cela fonctionne sur la mise à jour d'un AppPool existant, mais travaille à la création d'un pool d'APP et au réglage de la version .NET.

<iis:WebServiceExtension Id="AMS_AppPool" Name="AccountManagementSVC1" Identity="other" ManagedPipelineMode="integrated" ManagedRuntimeVersion="v4.0" User="AMS_AppPoolUser" RecycleMinutes="120" /> 
+0

Essayez sur Windows Server 2003 pour définir .NET 4, vous trouverez ASP.NET est laissé à la version 2.0. Il est nécessaire de définir la configuration du répertoire virtuel sur la version supérieure lorsque les paramètres du site Web ou du serveur par défaut sont inférieurs. Peut-être que c'est un bogue dans WIX, qu'il ne remappe pas le paramètre de version .NET du pool d'applications (qui n'existe que sur les versions IIS plus récentes) au paramètre de répertoire virtuel sur les anciennes versions. –

+0

La vérification de la documentation montre que ce paramètre ne prend en charge que IIS 7 ou supérieur. Le deuxième meilleur choix pour moi est l'exécution de l'aspnet_regiis en tant qu'action personnalisée pour les anciennes versions (voir les autres réponses ici). Vous ne pouvez donc l'utiliser que si vous êtes sûr que tous vos clients/utilisateurs ont Windows 2008/Vista ou supérieur. –

Questions connexes