¿Cómo agregar net.tcp a los "Protocolos habilitados" utilizando un proyecto/configuración WIX 3.5?
iis-7.5 wcf-binding (4)
Tenemos algunos paquetes MSI (generados por WIX) que instalan servicios WCF. La mayoría de estos servicios necesitan net.tcp para sus enlaces de punto final.
Me gustaría simplificar la vida de implementación y automatizar el proceso de agregar net.tcp. Ya conozco el WixIisExtension.dll y hago uso de sus funciones útiles (crear sitio web, directorio virtual, etc.).
¿Puedo usar WixIisExtension para habilitar el protocolo net.tcp? Si no, ¿cómo puedo lograr eso?
Puede echar un vistazo a este artículo en MSDN. Hay una sección al final que ilustra cómo usar la API administrada para lograr configurar un servicio habilitado para WAS. No estoy familiarizado con Wix, pero probablemente podría usar y conectar este código en algún paso de implementación personalizada.
Agregue un nuevo proyecto a su solución de instalación (Windows Installer XML -> C # Custom Action Project)
En este proyecto, agregue una referencia a la Asamblea Microsoft.Web.Administration, que se puede encontrar aquí: C: / Windows / System32 / inetsrv y se requiere para agregar los protocolos.
Mi acción personalizada se ve así:
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;
}
}
}
}
Tenga en cuenta que estoy asumiendo tres propiedades aquí: SITIO, DIRECTORIODIRECTUAL VIRTUAL Y PROTOCOLOS
Construye la solución ahora. En segundo plano, WiX crea dos conjuntos% Project% .dll y% Project% .CA.dll. El CA.dll incluye la Administración de Microsoft.Web dependiente automáticamente.
Luego, en su proyecto de instalación de WiX, incluya una referencia al nuevo Proyecto de acción personalizado. La referencia es necesaria para hacer referencia al% Projet% .CA.dll.
Edite el producto.wxs
Primero agregue las propiedades en algún lugar dentro del elemento del producto:
<!-- Properties -->
<Property Id="SITE" Value="MySite" />
<Property Id="VIRTUALDIRECTORYALIAS" Value="MyVirtDirectoryAlias" />
<Property Id="PROTOCOLS" Value="http,net.tcp" />
A continuación agregue el elemento binario:
<!-- Binaries -->
<Binary Id="CustomAction.EnableProtocols" SourceFile="$(var.Setup.CustomAction.EnableProtocols.TargetDir)Setup.CustomAction.EnableProtocols.CA.dll" />
Tenga en cuenta que debe agregar CA.dll.
A continuación, agregue la acción personalizada:
<!-- Custom Actions -->
<CustomAction Id="EnableProtocols" BinaryKey="CustomAction.EnableProtocols" DllEntry="EnableProtocols" Execute="immediate" Return="check" />
Y finalmente, la secuencia de instalación donde desea que se lleve a cabo la ejecución.
<!-- Installation Sequence -->
<InstallExecuteSequence>
<Custom Action="EnableProtocols" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>
eso es todo. Deberia trabajar. Gracias a Darin Dimitrov por proporcionar los enlaces de arriba.
Esta es la forma correcta de hacerlo en WIX (suponiendo que esté instalando en un sistema operativo de 64 bits; si no fuera por una suposición, diría que cambie CAQuietExec64
a CAQuietExec
aunque esto no se haya probado):
Obtenga una referencia a appcmd.exe:
<Property Id="APPCMD">
<DirectorySearch Id="FindAppCmd" Depth="1" Path="[WindowsFolder]/system32/inetsrv/">
<FileSearch Name="appcmd.exe"/>
</DirectorySearch>
</Property>
Defina las siguientes acciones personalizadas (las propiedades [WEB_SITE_NAME]
y [WEB_APP_NAME]
pueden rellenarse en otro lugar de su instalador, o para probar puede codificarlas):
<CustomAction
Id="SetEnableNetTCPCommmand"
Property="EnableNetTCP"
Value=""[APPCMD]" set app "[WEB_SITE_NAME]/[WEB_APP_NAME]" /enabledProtocols:http,net.tcp"/>
<CustomAction
Id="EnableNetTCP"
BinaryKey="WixCA"
DllEntry="CAQuietExec64"
Execute="deferred"
Return="ignore"
Impersonate="no" />
Ahora en InstallExecuteSequence
add
<InstallExecuteSequence>
...
<Custom Action="SetEnableNetTCPCommmand" After="InstallExecute">APPCMD AND NOT Installed</Custom>
<Custom Action="EnableNetTCP" After="SetEnableNetTCPCommmand">APPCMD AND NOT Installed</Custom>
...
</InstallExecuteSequence>
Y si todo está bien en el mundo, ahora actualizará los protocolos.
Esto no se puede hacer usando la extensión WiXII estándar, hasta donde yo sé. Por lo tanto, la única opción que tiene es una acción personalizada.
También puede encontrar interesante este hilo : da una pista sobre cómo lograr algo similar en el script MSBuild, pero debería poder traducirlo fácilmente a acciones personalizadas.
¡Buena suerte!