2010-06-29 10 views
11

У нас есть несколько пакетов MSI (сгенерированных WIX), которые устанавливают службы WCF. Для большинства этих служб требуется net.tcp для привязки конечных точек.Как добавить net.tcp в «Включенные протоколы» с помощью проекта/установки WIX 3.5?

Я хотел бы облегчить процесс развертывания и автоматизировать процесс добавления net.tcp. Я уже знаю WixIisExtension.dll и пользуюсь его полезными функциями (создайте веб-сайт, каталог virt и т. Д.).

Могу ли я использовать WixIisExtension для включения протокола net.tcp? Если нет, как я могу это достичь?

+0

В официальном приложении Windows Installer XML Toolset 3.5 Документация Я не мог найти ни одной темы, описывающей, как это сделать. Я бы предположил, что это должно быть возможно с использованием элементов IIS (например, WebDirProperties, WebVirtualDir или WebApplication), но нет ничего, что могло бы привести меня в правильном направлении. – DotNetter

ответ

1

Вы можете взглянуть на this article на MSDN. В конце есть раздел, который иллюстрирует, как использовать managed API для достижения настройки службы с поддержкой WAS. Я не знаком с Wix, но вы, вероятно, можете использовать и подключать этот код к некоторому пользовательскому шагу развертывания.

1

Это, как я знаю, не может быть выполнено с использованием стандарта WiXIIsExtension. Таким образом, единственный вариант, который у вас есть, - это настраиваемое действие.

Также вы можете найти this thread - это дает нам подсказку о том, как достичь подобной вещи в скрипте MSBuild, но вы можете легко перевести его на пользовательские действия.

Удачи вам!

7

Добавить новый проект в установочном Solution (установщик Windows XML -> C# Пользовательский проект Действие)

В этом проекте добавить ссылку на сборку Microsoft.Web.Administration, которую можно найти здесь: C: \ Windows \ System32 \ inetsrv и требуется добавить протоколы.

My Custom Action выглядит следующим образом:

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

Пожалуйста, обратите внимание, что я предполагаю, что три свойства здесь: САЙТ, VIRTUALDIRECTORYALIAS & ПРОТОКОЛЫ

Построить решение в настоящее время. В фоновом режиме WiX создает две сборки% Project% .dll и% Project% .CA.dll. CA.dll автоматически включает зависимую Microsoft.Web.Administration.

Затем в вашем проекте настройки WiX вы найдете ссылку на новый проект пользовательских действий. Ссылка необходима для ссылки на% Projet% .CA.dll.

Редактировать в product.wxs

Сначала добавьте свойства где-то внутри элемента продукта:

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

Ниже добавить двоичный элемент:

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

Обратите внимание, что вы должны добавьте CA.dll.

Ниже добавить настраиваемое действие:

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

и, наконец, последовательность установки, где требуется выполнение иметь место.

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

вот и все. Должно сработать. Спасибо Дарин Димитров за предоставленные выше ссылки.

+0

Великий мини-учебник. Спасибо, что написали, как обстоят дела. Esp ".CA.dll" voodoo. – granadaCoder

+0

Спасибо! Я добавил логику «проверить на наличие» здесь ::: Binding foundBinding = site.Bindings.FirstOrDefault (b => b.Protocol.Equals (bindingProtocol, StringComparison.OrdinalIgnoreCase) && b.BindingInformation.Equals (bindingInformation, StringComparison. OrdinalIgnoreCase)); – granadaCoder

+0

if (null == foundBinding) { //// добавить привязки session.Log ("О добавлении на сайт.Bindings. SITE = '{0}', BINDINGINFORMATION = '{1}', BINDINGPROTOCOL = '{ 2} '. ", Sitename, bindingInformation, bindingProtocol); site.Bindings.Add (bindingInformation, bindingProtocol); – granadaCoder

5

Вот это правильный способ сделать это в WIX (предполагается, что вы устанавливаете на операционной системе 64-битном - если не догадка, я бы сказал, что изменение CAQuietExec64 к CAQuietExec хотя это непроверенные):

Получить ссылку на appcmd.exe:

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

Определить следующие пользовательские действия (свойства [WEB_SITE_NAME] и [WEB_APP_NAME] может заполняться в другом месте в вашей установке, или для тестирования вы можете жестко закодировать их):

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

Теперь в InstallExecuteSequence добавить

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

И если все хорошо в мире, который теперь будет обновлять протоколы.

+0

Ницца, спасибо! – Ivan

+0

Хорошо играл. Я развертывал службу WCF, размещенную в IIS по именованным каналам. С некоторыми настройками у меня теперь есть «http, net.pipe» в моих разрешенных протоколах. Это не было в установщике по умолчанию wix-installer. – granadaCoder