ClickOnce 部署问题

18

我正在处理一个使用ClickOnce部署的项目,并且遇到了几个问题。

我的软件解决方案中有两个组件:需要.NET框架3.5才能运行的桌面客户端和列出可用文档并提供通过ClickOnce安装桌面客户端的方式的服务器(ASP.NET应用程序)。

我的第一个问题是先决条件问题:我需要一种在客户端安装之前安装3.5框架的方法。Visual Studio创建了一个setup.exe来处理这个问题,但为了使其工作,必须直接运行它(而不是链接到.application文件),并且在创建ClickOnce清单时必须知道部署URL

所以我又有了两个问题:显然没有办法在使用setup.exe安装后使用查询字符串参数运行客户端应用程序,因此,与其让服务器显示文档列表链接到像“.../client.application?document=doc1”这样的URL,我只能有一个链接到setup.exe的链接。

另一个问题更糟:服务器旨在用于相对较小的私有网络,而不是单个 Web 服务器。问题是:我不知道 ClickOnce 客户端在构建时的部署 URL,因此当选中“从网站安装”选项时,setup.exe无法正常运行。目前的解决方法是使用离线安装程序,其中包含大型 ZIP 文件中的setup.exe、先决条件和 ClickOnce 部署文件。

具有适当框架版本的用户仍然可以使用带有查询字符串的.application链接到文档来安装/更新客户端并打开文档。没有框架的用户会收到错误消息(“需要系统更新 blablabla 3.5.0.0 blabla GAC”),必须下载 ZIP 文件,将其提取到本地计算机并运行setup.exe文件以安装框架,然后安装客户端。之后,他必须返回到文档列表,并使用正确的参数链接启动客户端。

不用说,我对这种策略并不感到自豪,这破坏了所有 ClickOnce 部署的优势。

有没有可能以更优雅的方式解决先决条件问题?是否有一种简单的方法在部署网络时修改 ClickOnce 应用程序的安装 URL(例如编写 URL 到配置文件或其他内容)?


关于先决条件,我不得不更改用于查找下载文件的URL(“setup.exe-url = http://my.application.com”) 由于Web服务器配置的原因,使用与我的应用程序相同的位置下载的先决条件在第一次尝试时无法正常工作:MSP和MSU的MIME类型未注册,因此setup.exe无法获取先决条件文件。 - alfred barthand
3
一个小建议是尝试在StackOverflow上提出单独的问题,这样更容易让人们阅读和回答。此外,接受部分答案很困难,这对那些可能想要帮助您的人是不公平的。如果您需要提供更多背景信息,可以链接到您的其他问题,以帮助解释您所面临的问题的范围。 - jpierson
6个回答

7

我也一直在尝试解决“不知道 ClickOnce 客户端部署 URL”的问题。

我想到的最好的方法(我刚开始写,所以这还只是猜测)是编写一个实用程序,用户将运行该程序来设置 DeploymentUrl。这似乎在 .NET 中是可能的,但您需要:

  • 使用 ManifestReader.ReadManifest 读取清单
  • 设置 DeploymentUrl
  • 使用 ManifestWriter.WriteManifest 写入清单

然后,您需要使用 SecurityUtilities.SignFile 再次签署清单。

签名过程让我感到困扰。要么我必须使用一张一次性证书(这使签名毫无意义),要么我需要使用来自 CA 的证书,然后我必须分发我的密码以重新签署清单(这很愚蠢,因为它会使我的证书不安全)。所以我似乎只能让用户看到“未知发布者”和黄色感叹号...


我不确定是否可以将mage.exe与我的应用程序一起分发,但您的解决方案更简单、更好!关于黄色感叹号:只要它能工作,我就没问题。 - alfred barthand
重新分发mage可能是不允许的。我找不到任何MS可再分发清单中似乎没有它。MS对可以和不能再分发的内容非常严格。 - GrendleM
基本上,我一直面临着决定是否使用自己生成的证书或受信任的证书的问题。另一个我考虑并保留的选择是,当我的ASP.NET基础部署服务器使用时,客户可以提供自己的证书,该服务器负责重新签名、重新品牌等等。因此,至少我们的客户仍然有选择,但不幸的是,我们不能像“使用应用程序清单进行信任”选项那样使用选项,并在部署清单中仍具有一些自定义品牌。如果您不需要重新品牌,那么我建议使用该选项。 - jpierson
1
对于任何误入此处的迷失灵魂,mage.exe和mageui.exe在Windows SDK v7.1中被列为可再分发文件。 - Malachi

5
为了在我们的持续构建系统中构建ClickOnce应用程序并部署到多个测试服务器,我花了一些时间研究Mage和本文手动部署ClickOnce应用程序演示
我不确定这是否能解决您的第二个问题,但如果您要部署到多个服务器,它可能至少可以减轻构建过程中的一些痛苦。 如果您可以分发mage.exe(不确定Microsoft是否允许),您可以在安装期间现场修改您的清单。

1

也许一个解决方案是:

使用PublishUrl=http://clickonce/is/kinda/cool, 并在客户端计算机上更改位于%windir%\system32\drivers\etc\hosts的Windows hosts文件, 将主机clickonce指向服务器的固定IP地址

也许ClickOnce应该有一个选项来检测应用程序下载的服务器;如果有人知道,请在此处发布;


0

也许可以利用NAnt自动化更改部署URL。我使用它来自动化我的ClickOnce构建并更改清单的构建版本。 使用NAnt进行ClickOnce部署描述了我是如何实现的。


“ClickOnce with NAnt”链接已经失效。 - Peter Mortensen
这似乎是新的网址:http://aaronsprague.com/blog/post/Automate-ClickOnce-with-Nant.aspx - BlackICE

0
如果用户在域上,那么我会让系统管理员使用 Group Policies/Windows Update 或其他策略推送 .NET 3.5 来管理桌面。
这听起来像是一个环境问题。如果组织足够大以至于有系统管理员,那么应该由该人负责为应用程序提供运行环境。
如果组织中没有这个角色,则认为您需要手动解决。手动操作并不一定会破坏 ClickOnce 的所有优势...ClickOnce 的优势在于,您可以修改客户端,重新发布,客户端机器将自动升级...
我想另一个选择是编写一个获取和安装 .NET 3.5 然后安装应用程序的脚本,我之前没有做过这个...但我相信它会工作...实际上,您可以通过 Group Policies 部署启动脚本来获取 .NET 3.5,这将非常简单。

0

第二个问题:

您可以在项目、解决方案或 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中发布的位置。如果未指定InstallUrlUpdateUrl属性,则将其插入到ClickOnce应用程序清单中。

InstallUrl(未显示)是用户安装应用程序的位置。如果指定了此值,并且启用了IsWebBootstrapper属性,则将其写入setup.exe引导程序。如果未指定UpdateUrl,它也会被插入到应用程序清单中。

第一个问题:

如果上述答案不能满足您的需求,那么您似乎面临着一个典型的问题;如何在多台桌面上安装Windows可执行文件(在您的情况下为.NET Framework 3.5)。有多种解决方案,例如Group Policy(GP)脚本或WMI


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接