2013-04-24 27 views
7

Attualmente sto tentando di modificare il mio programma di installazione Wix (V3.5) per modificare le impostazioni Web.config dell'applicazione .NET che voglio installare. Questo va bene per le normali applicazioni ASP.NET ma ora sto tentando di applicare il mio progetto di configurazione Wix a un'applicazione di Entity Framework .NET, che come forse sapete ha un'impostazione di stringa di connessione più complicata con le impostazioni del modello .csdl e .ssdl.Modifica Web.Config Impostazioni stringa di connessione con Wix

Quindi, se il mio web.config impostazione stringa di connessione sembra somehting in questo modo: (dove [DBSERVER] & [NOMEDB] sono le proprietà retrived da una finestra di dialogo)

<connectionStrings> 
    <add name="SSITacticalSolutionEntities" connectionString="metadata=res://*/Model.TacticalSolutionModel.csdl|res://*/Model.TacticalSolutionModel.ssdl|res://*/Model.TacticalSolutionModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=sd-sql2008r2;Initial Catalog=SsiTacticalSolution1.2.4;Integrated Security=True;MultipleActiveResultSets=True&quot; /> 
    </connectionStrings> 

E posso modificare il mio web.config nella mia file di Product.Wsx con somehting come questo:

<util:XmlFile Id="ModifyConnectionString" Action="setValue" Permanent="yes" File="[INSTALLLOCATION]Web.config" 
        ElementPath="/configuration/connectionStrings/add[\[]@name='!(loc.EntityName)'[\]]" Name="connectionString" 
        Value="Data Source=[DBSERVER];Initial Catalog=[DBNAME];Integrated Security=true;providerName=System.Data.EntityClient;MultipleActiveResultSets=True&quot;" Sequence="5"/> 

ottengo una stringa di connessione come questo:

<connectionStrings> 
     <add name="SSITacticalSolutionEntities" connectionString="Data Source=sd-sql2008r2;Initial Catalog=SsiTacticalSolution1.2.4;Integrated Security=true;providerName=System.Data.EntityClient;MultipleActiveResultSets=True&quot;"/> 
    </connectionStrings> 

Che naturalmente ha senso, dal momento che sto chiedendo di sostituire l'attributo di stringa di connessione corrente con quello che ho definito nel valore.

Ma quello di cui ho veramente bisogno qui è modificare parti specifiche della mia stringa di connessione e lasciare il resto (c'è una sorta di azione di sostituzione che posso usare qui), cioè. lasciare tutte le impostazioni del mio modello sul posto e basta sostituire il server del database e il nome ecc. come ho bisogno di. Ero abituato a farlo con i programmi di installazione di Visual Studio senza problemi ed era così facile da usare.

Quindi la mia domanda è possibile farlo utilizzando util.XMLFile, o forse util: XmlConfig? Ho provato entrambi senza fortuna.

Oppure non è possibile farlo con util.XMLFile e dovrò farlo in CustomAction? Qualsiasi idea sarebbe di grande aiuto, grazie in anticipo ...

risposta

8

Ho ottenuto questo lavoro alla fine, alla fine non ho usato azioni personalizzate per questa particolare impostazione, io uso le variabili impostate nel mio file di localizzazione.

ho fatto perché sarebbe il dev piuttosto che l'utente che avrebbe saputo il nome del modello e le entità nome (non un utente attraverso la finestra di dialogo di installazione, che non saprebbe queste informazioni), quindi ho un file di localizzazione con diverse proprietà come il nome del prodotto, ecc., quindi ho aggiunto il nome di un modello e il suo nome. Tutto il resto che ottengo dalle finestre di dialogo, inserite dall'utente: es. Nome del database, directory virtuale, utente di impersonazione, ecc ...

Se aiuta qualcuno, ecco cosa mi è venuto alla fine per il mio web.config; Questa è la sezione del mio prodotto.wxs che si occupa di questo problema. Come potete vedere ho una proprietà stringa di connessione nella parte superiore, con un segnaposto per il loc.ModelName che si trova nel mio file di localizzazione:

<Property Id="CONNECTION_STRING" 
    Value="metadata=res://*/Model.!(loc.ModelName).csdl|res://*/Model.!(loc.ModelName).ssdl|res://*/Model.!(loc.ModelName).msl;provider=System.Data.SqlClient;provider connection string=&quot;"/> 

<!-- The root of the installer. --> 
<Directory Id='TARGETDIR' Name='SourceDir'> 

    <!-- Install into the inetpub/wwwroot directory --> 
    <Directory Id="IISMain" Name='inetpub'> 
    <Directory Id="WWWMain" Name='wwwroot' ComponentGuidGenerationSeed='C38ED13E-E1E3-40DB-B1FA-39400C6B2BC4'> 


     <Directory Id='INSTALLLOCATION' Name="!(loc.ProductName)"> 

     <!-- The component to define the Virtual Directory.--> 
     <Component Id="WebVirtualDirComponent" 
        Guid="D814F88F-6E0C-4365-A411-2F9807522C3D"> 

      <!-- WebVirtualDir: The virtual directory we are installing. --> 
      <!-- Alias:   Alias attribute is the name that we will see in IIS.--> 
      <!-- Directory:  The Directory attribute is the "Physical Path" property in 
          IIS and needs to tie to the ID specified above as the install location. --> 
      <!-- WebSite:  The WebSite attribute ties to a <WebSite> element in the 
          setup file(see below). As this is an example of installing into the 
          "Default Web Site" so that element is not under a component.--> 
      <iis:WebVirtualDir Id="VDir" Alias="[VIRTUALDIRECTORYVALUE]" 
          Directory="INSTALLLOCATION" 
           WebSite="DefaultWebSite"> 

      <!-- This turns the Virtual Directory into a web application. --> 
      <iis:WebApplication Id="MyWebAppApplication" 
           Name="[VIRTUALDIRECTORYVALUE]" WebAppPool="AppPool"/> 

      <iis:WebDirProperties Id="WebSite_Properties" AnonymousAccess="no" 
            WindowsAuthentication="yes" DefaultDocuments="!(loc.DefaultDocument)" 
            Script="yes" Read="yes" /> 

      </iis:WebVirtualDir> 
      <CreateFolder/> 
      <RemoveFolder Id= "GuidFolders" On= "uninstall"/> 
     </Component> 

     <!-- Components - this decides what we want to incude in our install 
     Here we will alter our web.config for Impersonation , debug to false and connection string. --> 
     <Component Id="Web.config" Guid="2ED81B77-F153-4003-9006-4770D789D4B6"> 

      <!--install our web.config file , this isnt part of our initial MSBUILD--> 
     <File Id="Web.config" Name="Web.config" Source="$(var.SolutionDir)!(loc.WebApplicationProjectName)\Web.config" DiskId="1" KeyPath="yes" /> 

      <!--Modify our web.config - here we need to add Identity impersonation , changes session settings , add connection string settings and set debug setting--> 
      <!--Ensure that the identity setting exists--> 
      <util:XmlFile Id="system.webidentity" 
         File="[INSTALLLOCATION]Web.config" 
         Action="createElement" 
         ElementPath="/configuration/system.web" 
         Name="identity" 
         SelectionLanguage="XPath" 
         Sequence="1" /> 

      <util:XmlFile Id="system.webIdentityAttribute" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="impersonate" 
         Value="true" 
         SelectionLanguage="XPath" 
         Sequence="2" /> 

      <util:XmlFile Id="system.webIdentityAttribute2" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="password" 
         Value="[IMPERSONATIONUSERPASSWORD]" 
         SelectionLanguage="XPath" 
         Sequence="3" /> 

      <util:XmlFile Id="system.webIdentityAttribute3" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/identity" 
         Name="userName" 
         Value="[IMPERSONATIONUSER]" 
         SelectionLanguage="XPath" 
         Sequence="4" /> 

      <util:XmlFile Id="ModifyConnectionString" 
         Action="setValue" 
         Permanent="yes" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/connectionStrings/add[\[]@name='!(loc.EntityName)'[\]]" 
         Name="connectionString" 
         Value="[CONNECTION_STRING]Data Source=[DBSERVER];Initial Catalog=[DBNAME];Integrated Security=True;MultipleActiveResultSets=True&quot;" 
         SelectionLanguage="XPath" 
         Sequence="5"/> 

      <!--<authentication mode="Forms">--> 
      <util:XmlFile Id="AuthenticationModeWindows" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/authentication" 
         Name="mode" 
         Value="Windows" 
         Sequence="6" /> 

      <!--Switch off debug--> 
      <util:XmlConfig Sequence="7" 
          Id="SwitchOffDebug" 
          File="[INSTALLLOCATION]\web.config" 
          Action="create" On="install" 
          Node="value" 
          ElementPath="/configuration/system.web/compilation" 
          Name="debug" 
          Value="false" /> 


      <!--Session configuration <sessionState mode="InProc" timeout="15" />--> 
      <util:XmlFile Id="system.websessionState" 
         File="[INSTALLLOCATION]Web.config" 
         Action="createElement" 
         ElementPath="/configuration/system.web" 
         Name="sessionState" 
         Sequence="8" /> 

      <util:XmlFile Id="system.websessionStateAttribute" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="mode" Value="InProc" 
         Sequence="9" /> 

      <util:XmlFile Id="system.websessionStateAttribute2" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="timeout" 
         Value="15" 
         Sequence="10" /> 

      <util:XmlFile Id="system.websessionStateAttribute3" 
         Action="setValue" 
         File="[INSTALLLOCATION]Web.config" 
         ElementPath="/configuration/system.web/sessionState" 
         Name="cookieName" 
         Value="[VIRTUALDIRECTORYVALUE]" 
         Sequence="11" /> 
     </Component> 

<iis:WebSite Id='DefaultWebSite' 
      Description='Default Web Site' 
      Directory='INSTALLLOCATION' SiteId ='[WEBSITEVALUE]' > 

    <iis:WebAddress Id="AllUnassigned" Port="80" /> 
</iis:WebSite> 
<iis:WebAppPool Id="AppPool" Name="[APPPOOLVALUE]" /> 

<CustomAction Id="MapVirtualDirectory" Directory="INSTALLLOCATION" Return="asyncNoWait" 
       ExeCommand='[ASPNETREGIIS] -norestart -s "W3SVC/[WEBSITEVALUE]/ROOT/[VIRTUALDIRECTORYVALUE]"' /> 

<InstallExecuteSequence> 
    <Custom Action="MapVirtualDirectory" After="InstallFinalize" >ASPNETREGIIS AND NOT Installed</Custom> 
</InstallExecuteSequence> 

<CustomAction Id="GetIISWebSites" BinaryKey="IisManager" DllEntry="GetWebSites" Execute="immediate" Return="check" /> 
<CustomAction Id="GetIISAppPools" BinaryKey="IisManager" DllEntry="GetAppPools" Execute="immediate" Return="check" /> 

<InstallUISequence> 
    <Custom Action="GetIISWebSites" After="CostFinalize" Overridable="yes">NOT Installed</Custom> 
    <Custom Action="GetIISAppPools" After="CostFinalize" Overridable="yes">NOT Installed</Custom> 
</InstallUISequence> 

<Feature Id='ApplicationFeatures' Title="!(loc.ProductName)" Level='1'> 
    <ComponentRef Id='WebVirtualDirComponent' /> 
    <ComponentGroupRef Id="MyWebApp_Project" /> 
    <ComponentRef Id="Web.config" /> 

</Feature> 

<!-- Specify UI --> 
<Property Id="WIXUI_INSTALLDIR">INSTALLLOCATION</Property> 
<UIRef Id="MyCustomUI"/> 

Ecco il mio file di localizzazione:

<?xml version="1.0" encoding="utf-8"?> 
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization"> 

    <!--application settings--> 
    <String Id="LANG">1033</String> 
    <String Id="ProductName">MyTestWebSite</String> 
    <String Id="ProductVersion">1.0.0.0</String> 
    <String Id="CompanyName">MyCompanyName</String> 
    <String Id="DefaultDocument">Default.aspx</String> 
    <String Id="WebApplicationProjectName">MyWebApp</String> 


    <!--database settings--> 
    <String Id="EntityName">MyEntities</String> 
    <String Id="ModelName">MyModel</String> 

</WixLocalization> 
+1

Necro ma ... è meglio provare a sostituire i tuoi veri GUID con "PUT-GUID-HERE" negli esempi. – Izzy

+1

Grazie per il suggerimento Izzy – Alicia

2

XmlFile e XmlConfig entrambi scrivono attributi a livello atomico. Per ottenere il comportamento desiderato, è necessario scrivere un'azione immediata immediata per leggere il file XML e archiviare il risultato in un Property. Quindi manipola quello Property come meglio credi (potrebbe essere necessario farlo nell'azione personalizzata se la manipolazione è complessa), quindi avere XmlFile o XmlConfig scrivere indietro l'intero valore manipolato.

Questo metodo richiede il set meno complicato di azioni personalizzate nel codice, consentendo a XmlFile e XmlConfig di eseguire il sollevamento pesante e gestire il rollback e tutto il resto. Apportare le modifiche all'idimotore Property.

Buona fortuna!

+0

Grazie Rob. Attualmente non aggiungo il mio web.config tramite il processo msbuild e lo aggiungo separatamente tramite un componente sul mio product.wsx. La ragione di questo è, oltre a manipolare le impostazioni di connectiontring, ho anche molti altri Alicia

+0

Sì, alla fine devi inserire il risultato in una 'Proprietà 'o serie di proprietà che si risolvono in una riga in' XmlFile'. Sono sicuro che sia fattibile, il diavolo è solo nei dettagli. :) –

Problemi correlati