Проблемы с развертыванием ClickOnce
Я работаю над проектом, развернутым с помощью ClickOnce, и у меня есть несколько проблем.
В моем программном решении есть два компонента: настольный клиент, которому требуется .NET framework 3.5 для запуска, а сервер (ASP.NET приложение), в котором перечислены доступные документы и предоставляется способ установки клиентского стола с помощью ClickOnce.
Моя первая проблема - это предварительные условия: мне нужен способ установки рамки 3.5 до установки клиента. Visual studio создает setup.exe
, который позаботится об этом, но для его работы он должен запускаться напрямую (вместо ссылки на файл .application
) и развертывания URL должен быть известен при создании манифеста ClickOnce.
Таким образом, у меня есть еще две проблемы: по-видимому, нет возможности запустить клиентское приложение с аргументами строки запроса после установки его с помощью setup.exe
, поэтому вместо того, чтобы иметь сервер, отображающий список документов, ссылающийся на URL-адрес типа ".../client.application?document=doc1" У меня есть только ссылка на setup.exe
.
Другая проблема - наихудшая: сервер предназначен для использования в относительно небольших частных сетях, а не на одном веб-сервере. Проблема заключается в следующем: я не знаю URL развертывания клиента ClickOnce во время сборки, поэтому setup.exe
не может работать должным образом, когда установлен флажок "установить с веб-сайта". На данный момент обходным решением является наличие автономного установщика, который содержит setup.exe
, предварительные требования и файлы развертывания ClickOnce в большом ZIP файле.
Пользователь с соответствующей версией фреймворка может по-прежнему использовать ссылку .application
с запросом к документу для установки/обновления клиента и открытия документа. Пользователь без рамки получает сообщение об ошибке ( "Требуется обновление системы blablabla 3.5.0.0 blabla GAC" ), и ему необходимо загрузить ZIP файл, извлечь его на свой локальный компьютер и запустить файл setup.exe
для установки фреймворка и затем клиент. И после этого он должен вернуться к списку документов и использовать ссылку для запуска клиента с правильными аргументами.
Излишне говорить, что я не очень горжусь этой стратегией, которая разрушает все преимущества развертывания ClickOnce.
Можно ли избавиться от вопроса о предварительных требованиях более элегантным способом? Есть ли простой способ изменить URL-адрес установки приложения ClickOnce при развертывании сервера в сети (например, написать URL-адрес в файле конфигурации или что-то еще)?
Ответы
Ответ 1
Я тоже пытаюсь решить проблему "Я не знаю URL-адрес развертывания клиента clickonce во время сборки".
Лучшее, что я могу придумать (я только начал писать, так что это все еще спекуляция) заключается в том, чтобы написать утилиту, которую будет запускать конечный пользователь, который установит deployURL. Это возможно в .NET, но вам нужно:
- Читайте в манифесте с помощью ManifestReader.ReadManifest
- установите DeploymentUrl
- ManifestWriter.WriteManifest
Затем вам нужно снова подписать манифест, используя SecurityUtilities.SignFile
Процесс подписания меня беспокоит. Либо я должен использовать сертификат throwaway (который делает подписку бессмысленным), либо мне нужно использовать сертификат из CA, а затем мне нужно распространять мой пароль, чтобы отменить манифест (что глупо, поскольку это делает мой сертификат незащищенным), Поэтому мне кажется, что я остался с пользователем, увидев "Неизвестный издатель" и желтый восклицательный знак...
Ответ 2
Чтобы создавать приложения ClickOnce в нашей системе непрерывной сборки и развертываться на нескольких тестовых серверах, я провел некоторое время с Mage и статьей Пошаговое руководство. Ручное развертывание приложения ClickOnce.
Я не уверен, что это решит вашу вторую проблему, но при развертывании на нескольких серверах может возникнуть какая-то боль из процесса сборки. Если вы можете распространять mage.exe
(не уверены, разрешает ли Microsoft), вы можете изменять свои манифесты на месте во время установки.
Ответ 3
Возможно, решение будет:
Использовать PublishUrl = http:// clickonce/is/kinda/cool
и на клиентском компьютере изменить файл хостов Windows, расположенный на
<Б > % WINDIR%\system32\Drivers\Etc\хостов
и укажите хост-узел хоста на фиксированный IP-адрес сервера.
Возможно, ClickOnce должен иметь возможность определять сервер, на котором было загружено приложение; Если кто-нибудь знает, пожалуйста, напишите здесь;
Ответ 4
Возможно, NAnt можно использовать для автоматизации изменения URL-адреса развертывания. Я использую его для автоматизации сборки ClickOnce и изменения версии сборки манифеста.
ClickOnce with NAnt описывает, как я это сделал.
Ответ 5
Если пользователи находятся в домене, тогда у меня будет sysadmin push.NET 3.5, используя Групповые политики/Центр обновления Windows или любая другая стратегия, используемая для управления рабочими столами.
Это звучит как проблема с окружающей средой. Если организация достаточно велика для того, чтобы иметь системного администратора, то ответственность за предоставление среды для запуска приложения должна быть именно этим человеком.
Если организация не имеет человека в этой роли, я верю, что вы вернулись к своему ручному решению. Кроме того, выполнение этого вручную не обязательно ломает "все преимущества ClickOnce"... Преимущества для ClickOnce заключаются в том, что вы можете модифицировать клиент, повторно публиковать и клиентские машины будут автоматически обновляться...
Я полагаю, что другой вариант - написать script, который получает и устанавливает .NET 3.5, а затем устанавливает приложение, я раньше этого не делал... Я уверен, что это сработает... На самом деле, вы могли бы развернуть запуск script с помощью групповых политик, который также получит .NET 3.5, это будет очень просто.
Ответ 6
Второй вопрос:
Вы можете использовать цель публикации MSBuild для проекта, решения или файла MSBuild следующим образом:
C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe "C:\path\foo.vbproj" /target:Publish /property:"PublishUrl=http://clickonce/is/kinda/cool/" /property:"PublishUrl=http://clickonce/is/kinda/cool/"
PublishUrl
- это место, где приложение будет опубликовано в среде IDE. Он вставляется в манифест приложения ClickOnce, если не указано свойство InstallUrl
и UpdateUrl
.
InstallUrl
(не показано) - это место, где пользователи будут устанавливать приложение. Если указано, это значение записывается в загрузчик setup.exe
, если свойство IsWebBootstrapper включено. Он также вставляется в манифест приложения, если UpdateUrl
не указан.
Первый вопрос:
Если приведенный выше ответ не позаботится о ваших потребностях, то мне кажется, что вы столкнулись с типичной проблемой; как получить исполняемый файл Windows (в вашем случае .NET Framework 3.5), установленный на нескольких рабочих столах. Существует несколько решений, таких как групповая политика (GP) скрипты или WMI.