2010-06-29 10 views
11

Abbiamo alcuni pacchetti MSI (generati da WIX) che installano i servizi WCF. La maggior parte di questi servizi richiede net.tcp per i collegamenti degli endpoint.Come aggiungere net.tcp ai "Protocolli abilitati" usando un progetto/setup WIX 3.5?

Mi piacerebbe semplificare la nostra implementazione e automatizzare il processo di aggiunta di net.tcp. Conosco già il WixIisExtension.dll e faccio uso delle sue utili funzioni (creare sito web, directory virt, ecc.).

Posso utilizzare WixIisExtension per abilitare il protocollo net.tcp? In caso contrario, come posso ottenerlo?

+0

Nella documentazione ufficiale di Windows Installer XML Toolset 3.5 non sono riuscito a trovare alcun argomento che descriva come farlo. Avrei pensato che fosse possibile utilizzare gli elementi di IIS (come WebDirProperties, WebVirtualDir o WebApplication) ma non c'è nulla che possa portarmi nella giusta direzione. – DotNetter

risposta

1

È possibile dare un'occhiata a this article su MSDN. C'è una sezione alla fine che illustra come usare managed API per configurare un servizio abilitato WAS. Non ho familiarità con Wix ma probabilmente potresti usare e collegare questo codice in qualche passaggio di distribuzione personalizzato.

1

Questo non può essere eseguito utilizzando lo standard WiXIIsExtension, per quanto ne so. Pertanto, l'unica opzione che hai è un'azione personalizzata.

si possono anche trovare this thread interessante - dà un suggerimento su come realizzare la cosa simile nello script MSBuild, ma si dovrebbe essere in grado di tradurre in un'azione personalizzata facilmente.

Buona fortuna!

7

Aggiungere un nuovo progetto alla soluzione di installazione (Windows Installer XML -> C# Progetto azione personalizzata)

in questo progetto aggiungere un riferimento all'Assemblea Microsoft.Web.Administration, che può essere trovato qui: C: \ Windows \ System32 \ inetsrv ed è necessario per aggiungere i protocolli.

mia azione personalizzata si presenta così:

using System; 
using System.Linq; 
using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Web.Administration; 

namespace Setup.CustomAction.EnableProtocols 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult EnableProtocols(Session session) 
     { 
      session.Log("Begin EnableProtocols"); 

      var siteName = session["SITE"]; 
      if (string.IsNullOrEmpty(siteName)) 
      { 
       session.Log("Property [SITE] missing"); 
       return ActionResult.NotExecuted; 
      } 

      var alias = session["VIRTUALDIRECTORYALIAS"]; 
      if (string.IsNullOrEmpty(alias)) 
      { 
       session.Log("Property [VIRTUALDIRECTORYALIAS] missing"); 
       return ActionResult.NotExecuted; 
      } 

      var protocols = session["PROTOCOLS"]; 
      if (string.IsNullOrEmpty(protocols)) 
      { 
       session.Log("Property [PROTOCOLS] missing"); 
       return ActionResult.NotExecuted; 
      } 

      try 
      { 
       var manager = new ServerManager(); 

       var site = manager.Sites.FirstOrDefault(x => x.Name.ToUpper() == siteName.ToUpper()); 
       if (site == null) 
       { 
        session.Log("Site with name {0} not found", siteName); 
        return ActionResult.NotExecuted; 
       } 

       var application = site.Applications.FirstOrDefault(x => x.Path.ToUpper().Contains(alias.ToUpper())); 
       if (application == null) 
       { 
        session.Log("Application with path containing {0} not found", alias); 
        return ActionResult.NotExecuted; 
       } 

       application.EnabledProtocols = protocols; 
       manager.CommitChanges(); 
       return ActionResult.Success; 
      } 
      catch (Exception exception) 
      { 
       session.Log("Error setting enabled protocols: {0}", exception.ToString()); 
       return ActionResult.Failure; 
      } 
     } 
    } 
} 

Si prega di notare che io parto dal presupposto tre proprietà qui: SITO, VIRTUALDIRECTORYALIAS & PROTOCOLLI

creare la soluzione ora. In background, WiX crea due assembly% Project% .dll e% Project% .CA.dll. Il file CA.dll include automaticamente Microsoft.Web.Administration.

Quindi nel progetto di installazione WiX includere un riferimento al nuovo progetto di azione personalizzata. Il riferimento è necessario per fare riferimento a% Projet% .CA.dll.

Modifica le product.wxs

Prima aggiungere le proprietà da qualche parte all'interno dell'elemento del prodotto:

<!-- Properties --> 
<Property Id="SITE" Value="MySite" /> 
<Property Id="VIRTUALDIRECTORYALIAS" Value="MyVirtDirectoryAlias" /> 
<Property Id="PROTOCOLS" Value="http,net.tcp" /> 

seguito aggiungere l'elemento binario:

<!-- Binaries --> 
<Binary Id="CustomAction.EnableProtocols" SourceFile="$(var.Setup.CustomAction.EnableProtocols.TargetDir)Setup.CustomAction.EnableProtocols.CA.dll" /> 

Nota che devi aggiungere il file CA.dll.

seguito aggiungere l'azione personalizzata:

<!-- Custom Actions --> 
<CustomAction Id="EnableProtocols" BinaryKey="CustomAction.EnableProtocols" DllEntry="EnableProtocols" Execute="immediate" Return="check" /> 

E infine la sequenza di installazione in cui si desidera l'esecuzione di prendere posto.

<!-- Installation Sequence --> 
<InstallExecuteSequence> 
    <Custom Action="EnableProtocols" After="InstallFinalize">NOT Installed</Custom> 
</InstallExecuteSequence> 

questo è tutto. Dovrebbe funzionare. Grazie a Darin Dimitrov per aver fornito i link sopra.

+0

Grande mini tutorial. Grazie per aver spiegato come si riferiscono le cose. Esp il voodoo ".CA.dll". – granadaCoder

+0

Grazie! Ho aggiunto una logica "verifica la presenza" qui ::: Binding foundBinding = site.Bindings.FirstOrDefault (b => b.Protocol.Equals (bindingProtocol, StringComparison.OrdinalIgnoreCase) && b.BindingInformation.Equals (bindingInformation, StringComparison. OrdinalIgnoreCase)); – granadaCoder

+0

if (null == foundBinding) { //// aggiungi binding session.Log ("Informazioni su Site.Bindings. SITE = '{0}', BINDINGINFORMATION = '{1}', BINDINGPROTOCOL = '{ 2} ".", Sitename, bindingInformation, bindingProtocol); site.Bindings.Add (bindingInformation, bindingProtocol); – granadaCoder

5

Ecco il modo giusto per fare questo in WIX (supponendo che si sta installando su un sistema operativo a 64 bit - se non a occhio e croce direi che il cambiamento CAQuietExec64 a CAQuietExec anche se questo è non testato):

ottenere un riferimento a appcmd.exe:

<Property Id="APPCMD"> 
    <DirectorySearch Id="FindAppCmd" Depth="1" Path="[WindowsFolder]\system32\inetsrv\"> 
    <FileSearch Name="appcmd.exe"/> 
    </DirectorySearch> 
</Property> 

definire le seguenti azioni personalizzate (le proprietà [WEB_SITE_NAME] e [WEB_APP_NAME] possono essere popolati altrove nel vostro installatore, o per testare è possibile codificare loro):

<CustomAction 
    Id="SetEnableNetTCPCommmand" 
    Property="EnableNetTCP" 
    Value="&quot;[APPCMD]&quot; set app &quot;[WEB_SITE_NAME]/[WEB_APP_NAME]&quot; /enabledProtocols:http,net.tcp"/> 

<CustomAction 
    Id="EnableNetTCP" 
    BinaryKey="WixCA" 
    DllEntry="CAQuietExec64" 
    Execute="deferred" 
    Return="ignore" 
    Impersonate="no" /> 

Ora, nel InstallExecuteSequence aggiungere

<InstallExecuteSequence> 
    ... 
    <Custom Action="SetEnableNetTCPCommmand" After="InstallExecute">APPCMD AND NOT Installed</Custom> 
    <Custom Action="EnableNetTCP" After="SetEnableNetTCPCommmand">APPCMD AND NOT Installed</Custom> 
    ... 
</InstallExecuteSequence> 

E se tutto va bene nel mondo che sarà ora aggiornare i protocolli.

+0

Bello, grazie! – Ivan

+0

Ben giocato. Stavo distribuendo un servizio WCF ospitato in IIS su pipe denominate. Con alcune modifiche, ora ho "http, net.pipe" nei miei protocolli abilitati. Questo non essere nel default di wix-installer era una delusione. – granadaCoder

Problemi correlati