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