2013-04-24 2 views
7

В настоящее время я пытаюсь изменить установщик Wix (V3.5), чтобы отредактировать настройки Web.config приложения .NET, которое я хочу установить. Это нормально для обычных приложений ASP.NET, но теперь я пытаюсь применить мой проект Wix для проекта Entity Framework .NET, который, как вы знаете, имеет более сложную настройку строки подключения с параметрами модели .csdl и .ssdl.Редактирование настроек строки подключения Web.Config с помощью Wix

Так что, если моя web.config установка строки соединения выглядит somehting следующим образом: (где [DBSERVER] & [DBNAME] являются свойства retrived из диалога)

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

И я редактировать мой Web.config в моем Product.Wsx файл с somehting так:

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

я строка соединения, как это:

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

Что, конечно, имеет смысл, так как им предлагается заменить текущий атрибут строки соединения на то, что я определил в значении.

Но мне действительно нужно здесь отредактировать определенные части строки подключения и оставить оставшуюся часть (есть ли какое-то действие замены, которое я могу использовать здесь), т. Е. оставьте все мои настройки модели на месте и просто замените сервер базы данных и имя и т. д., как мне нужно. Раньше я делал это с установщиками Visual Studio без проблем, и это было так просто в использовании.

Так что мой вопрос заключается в том, может ли это быть выполнено с использованием util.XMLFile или, может быть, использовать: XmlConfig? Я пробовал оба без везения.

Или это не возможно сделать с util.XMLFile, и нужно ли мне это делать вместо CustomAction? Любые идеи были бы очень полезны, спасибо заранее ...

ответ

8

Я получил эту работу в конце, в конце концов, я не использовал пользовательские действия для этого конкретного параметра, я использую переменные, установленные в моем файле локализации.

Я сделал это, потому что это был бы разработчик, а не пользователь, который знал бы имя модели и имя сущностей (не пользователь через диалог установки, они не знали бы эту информацию), поэтому у меня есть файл локализации с различными свойствами в нем, как имя продукта и т. д., поэтому я добавил в название модели и дал название этому. Все остальное я получаю из диалоговых окон, введенных пользователем: например, имя базы данных, виртуальный каталог, пользователь олицетворения и т. Д.

Если это кому-то помогает, вот что я в итоге получил для моего web.config; Это раздел моего продукта.wxs, который занимается этой проблемой. Как вы можете видеть, у меня есть свойство строки соединения в верхней части, с заполнителем для loc.ModelName, который установлен в моей локализации файла:

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

Вот мой файл локализации:

<?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 но ... лучше практиковать замену своих настоящих GUID на «PUT-GUID-HERE» в примерах. – Izzy

+1

Спасибо за отзыв Izzy – Alicia

2

XmlFile и XmlConfig оба атрибута записи на атомном уровне. Чтобы получить нужное поведение, вы хотите написать немедленное пользовательское действие для чтения XML-файла и сохранить результат в Property. Затем обработайте это Property, как вы сочтете нужным (вам может понадобиться сделать это в вашем настраиваемом действии, если манипуляция сложна), затем введите XmlFile или XmlConfig напишите все обратимое значение обратно.

Этот метод потребует наименее сложного набора пользовательских действий в вашем коде, позволяя XmlFile и XmlConfig выполнять тяжелый подъем и откат ручек и все такое. Просто внесите изменения в idempotent Property.

Удачи вам!

+0

Спасибо Rob.I в настоящее время не добавляю мой web.config через процесс msbuild и добавляю его отдельно через компонент в моем product.wsx. Причина этого заключается в том, что, манипулируя настройками connectionstring, у меня также есть несколько других Alicia

+0

Да, в конце вы должны подать результат в 'Свойство' или ряд свойств, которые разрешают до строки в' XmlFile'. Я уверен, что это выполнимо, дьявол просто в деталях. :) –

Смежные вопросы