Проблемы с развертыванием 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.