Как добавить net.tcp к включенным протоколам с помощью проекта/настройки WIX 3.5?

У нас есть несколько пакетов MSI (созданных WIX), которые устанавливают службы WCF. Большинству этих служб требуется файл net.tcp для привязки конечных точек.

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

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


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


Ответы (4)


Добавьте новый проект в решение по установке (XML установщика Windows -> Проект настраиваемого действия C#)

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

Мое пользовательское действие выглядит так:

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

Обратите внимание, что здесь я предполагаю три свойства: SITE, VIRTUALDIRECTORYALIAS и PROTOCOLS.

Создайте решение сейчас. В фоновом режиме 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>

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

person ms007    schedule 21.06.2012
comment
Отличный мини-урок. Спасибо, что рассказали, как все взаимосвязано. Особенно вуду .CA.dll. - person granadaCoder; 04.02.2017
comment
Спасибо! Я добавил сюда проверку существующей логики ::: Binding foundBinding = site.Bindings.FirstOrDefault(b =› b.Protocol.Equals(bindingProtocol, StringComparison.OrdinalIgnoreCase) && b.BindingInformation.Equals(bindingInformation, StringComparison.OrdinalIgnoreCase) ); - person granadaCoder; 13.02.2017
comment
if (null == foundBinding) { //// добавить привязки session.Log(О добавлении в Site.Bindings. SITE='{0}', BINDINGINFORMATION='{1}', BINDINGPROTOCOL='{2}'., имя сайта, информация о привязке, протокол привязки); site.Bindings.Add (информация о привязке, протокол привязки); - person granadaCoder; 13.02.2017
comment
serverManager.CommitChanges(); session.Log(ServerManager.CommitChanges успешно добавлен в Site.Bindings. SITE='{0}', BINDINGINFORMATION='{1}', BINDINGPROTOCOL='{2}'., sitename,bindingInformation,bindingProtocol); результат = истина; } - person granadaCoder; 13.02.2017
comment
else { session.Log(string.Format(Привязка уже существует. (SiteName='{0}',bindingInformation='{1}',bindingProtocol='{2}'),sitename,bindingInformation,bindingProtocol)); результат = истина; /* не сбой, если привязка уже существует, смысл в том, чтобы иметь привязку */ } - person granadaCoder; 13.02.2017

Вот правильный способ сделать это в 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>

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

person satnhak    schedule 05.12.2013
comment
Отлично сработано. Я развертывал службу WCF, размещенную в IIS, по именованным каналам. С помощью нескольких настроек у меня теперь есть http,net.pipe в моих включенных протоколах. Отсутствие в установщике wix по умолчанию было разочарованием. - person granadaCoder; 03.02.2017

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

person Darin Dimitrov    schedule 22.11.2010

Насколько мне известно, это невозможно сделать с помощью стандартного WiXIIsExtension. . Таким образом, единственный вариант, который у вас есть, — это пользовательское действие.

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

Удачи!

person Yan Sklyarenko    schedule 25.11.2010