ClickOnce 部署的疑难解答 

本主题介绍服务器必备条件,并提供 ClickOnce 部署中遇到的常见问题的指南。

启用锁定文件扩展名的下载

IIS(Internet 信息服务)会保护某些文件类型,例如 .config 文件和 .mdb
文件。如果应用程序有锁定的文件,请执行以下操作启用对此类文件的下载:

  • 在 inetmgr 中打开 vroot 的“属性”页。
  • 在“虚拟目录”选项卡上单击“配置”。

您将看到一个应用程序映射列表。删除 .config 扩展名的映射以启用 .config
文件下载。对此列表中希望作为应用程序一部分下载的所有其他扩展名重复此操作。

出于安全原因,有些 Web 服务器的配置会阻止不常用于 Web
内容的文件。例如,具有以下扩展名的文件可能会被阻止:.dll、.config、.mdf。基于 Windows
的应用程序通常包含带有其中一些扩展名的文件。如果用户尝试运行的 ClickOnce 应用程序要访问 Web
服务器上被阻止的文件,将产生一个错误。无需取消对所有文件扩展名的阻止,默认情况下,每个应用程序文件都使用“.deploy”文件扩展名发布。如果使用此选项,Web
服务器只需配置为允许以下三种文件扩展名即可:

  • .application
  • .manifest
  • .deploy

但是,可以禁用此选项,方法是清除“发布选项”对话框上的“使用‘deploy’文件扩展名”选项,这时必须配置 Web
服务器以允许应用程序中使用的所有文件扩展名。

有时您必须配置 .manifest、.application 和 .deploy,例如在使用未安装 .NET Framework 的 IIS
的情况下,或在使用其他 Web 服务器(例如,Apache)的情况下。

配置过期设置

通过 URL 启动应用程序时,Internet Explorer 执行 .application
文件的下载。因此,所有通知浏览器缓存文件的过期设置都将有效。客户端会因此而不检测新的更新,而是使用 IE 缓存中的
.application。若要确保客户端在每当更新可用时都立即检测更新,请启用 IIS 中的“立即过期”选项。

在 IIS 中执行此操作:

  • 运行 inetmgr 并打开 vroot(或整个服务器)的“属性”页。
  • 单击“HTTP 标头”选项卡。
  • 单击“启用内容过期”。
  • 单击“立即过期”。
  • 重新启动 IIS。

不支持 FTP 协议

ClickOnce 支持从任何 HTTP 1.1 Web 服务器或文件服务器上安装应用程序。FTP 协议不受支持。可以使用 ftp://
协议发布应用程序,但必须使用 http://、https:// 或 file:// 协议执行安装。

正确配置服务器

使用 ClickOnce 时的一个最常见的问题就是 ClickOnce 因配置问题而无法从网络服务器下载文件。如果在 ClickOnce
安装过程中遇到下载文件的问题,请尝试使用 Internet Explorer 下载相同的文件。这样将把问题范围缩小到 ClickOnce
问题,而不是普通的服务器/网络问题。

需要管理员特权

如果使用 HTTP 发布,则您必须具备目标服务器上的管理员特权(IIS 需要此特权级别)。如果不使用 HTTP
发布,则只需具备目标路径上的写权限。

必须启用匿名访问

向关闭了“匿名访问”的远程服务器发布时,您将收到下面的警告:

"The files could not be downloaded from http://<remoteserver>/<myapplication>/.  The remote server returned an error: (401) Unathorized."

若要解决此问题,请在 Windows
资源管理器中右击“我的电脑”,然后选择“管理”。在“计算机管理”对话框中,依次打开“服务和应用程序”节点、“Internet
信息服务”、“网站”,然后右击“默认网站”。在“默认网站属性”对话框中,单击“目录安全性”选项卡,然后单击“编辑”按钮。在“身份验证方法”对话框中,选择“匿名访问”复选框。

Windows XP SP2:Windows 防火墙

默认情况下,Windows XP SP2 启用 Windows 防火墙。如果在安装有 Windows XP 的计算机上开发应用程序,仍能从本地 IIS
服务器发布和运行 ClickOnce 应用程序。但是,如果不打开 Windows 防火墙,则无法从其他计算机访问该 IIS 服务器。若要管理 Windows
防火墙,请从“控制面板”中选择“Windows 防火墙”。

Windows Server 2003:启用 FrontPage 服务器扩展

使用 HTTP 将应用程序发布到 Windows Web 服务器需要 FrontPage 服务器扩展 (FPSE)。

默认情况下,Windows Server 2003 不安装 FPSE。如果希望使用 Visual Studio 通过具有 FPSE 的 HTTP
将应用程序发布到 Windows Server 2003 Web 服务器,必须先安装 FPSE。可以使用 Windows Server 2003
中的“管理您的服务器”管理工具完成此工作。

MIME 类型映射

在 HTTP 上发布时,.application 文件的 MIME
类型应为“application/x-ms-application”。如果服务器上安装有 .NET Framework
2.0,该类型将自动设置。如果没有安装,则需要为 ClickOnce 应用程序 vroot(或整个服务器)创建 MIME 类型关联。

在 IIS 中执行此操作:

  • 运行 inetmgr 并打开 vroot(或整个服务器)的“属性”页。
  • 单击“HTTP 标头”选项卡。
  • 单击“Mime 映射”部分中的“文件类型”按钮。
  • 单击“新建类型”添加一个新类型。在“相关扩展名”中键入 application;在“内容类型 (MIME)”中键入
    application/x-ms-application
  • 重新启动 IIS。

Windows Server 2003:锁定的 MIME 类型

Windows Server 2003 上的 IIS 会锁定除某些已知类型(例如 .htm、.html、.txt
等)以外的所有文件类型。要使用此服务器部署 ClickOnce 应用程序,需要更改 IIS 设置以允许下载 .application、.manifest
以及应用程序使用的所有其他自定义文件类型的文件。

在 IIS 中执行此操作:

  • 运行 inetmgr 并打开该计算机节点的“属性”页。
  • 单击“MIME 类型”按钮。
  • 单击“新建”按钮,然后添加新的扩展名和必要的 MIME 类型。

    对于 .application 和 .manifest 扩展名,MIME
    类型应为“application/x-ms-application”。对于其他文件类型,MIME
    类型应为“application/octet-stream”。

    如果创建带有扩展名“*”且 MIME 类型为“application/octet-stream”的 MIME
    类型,将允许下载未阻止的文件类型的文件。(但是不能下载阻止的文件类型,例如 .aspx 和 .asmx)。

  • 重新启动 IIS。

使用 ClickOnce 错误日志

  • 发生 ClickOnce 错误时,通常会显示一个带有“详细信息”按钮的错误对话框。单击此按钮将打开该应用程序的 ClickOnce
    日志文件。请在此日志文件中查找特定错误信息,该信息将指出何处出错。如果其中的信息不足以帮助诊断和解决问题,请参考本疑难解答指南中的以下内容。
  • ClickOnce 为每个应用程序维护一个日志文件。该文件存储在 wininet 缓存中,因此适用于自动清理机制。
  • 指定自定义日志位置:要使 ClickOnce 将日志写入到特定位置,请将注册表项
    [HKCU\Software\Microsoft\Windows\CurrentVersion\Deployment] “LogFilePath”
    (STRING) 设置为一个文件,例如“c:\logs\ClickOnceLog.txt”。确保计算机上存在此目录 (c:\logs)。所有应用程序的全部
    ClickOnce 日志消息都将写入此文件。

手动更改清单或应用程序时的注意事项

Visual Studio 发布负责设置应用程序和清单。但是,如果在 Visual Studio 以外更新部署(例如使用
MAGE),则需注意一些问题:

  • 如果更新应用程序中的文件,则必须更新应用程序清单中对该文件的引用,因为该文件将更改。
  • 如果以任何方式更新应用程序清单,则必须在部署清单中更新应用程序清单引用。当使用 MageUI
    在部署清单中更新应用程序清单引用时,请确保基本代码指向您的应用程序清单。MageUI
    始终假定应用程序清单是一个带有版本的子目录,而这一假定不一定总是正确的。
  • 如果以任何方式更新清单,则必须再次对它签名。

使用部署提供程序的注意事项

这里介绍当您在客户端发现 ClickOnce 应用程序出现意外行为时应注意的问题。ClickOnce 部署清单具有一个
deploymentProvider 属性,该属性指向安装应用程序和为应用程序提供服务的源位置的完整路径。

在部署清单中查找下面一行:

<deploymentProvider codebase="http://myserver/myapp.application" />

这行内容是在创建 ClickOnce 应用程序时设置的,对于“安装的”应用程序,这是必需的设置。该设置中的位置是一个标准位置,ClickOnce
安装程序从该位置安装应用程序和查找更新。所有应用程序文件都将从相对于此路径的位置安装。

因此,如果使用 xcopy 命令将 ClickOnce 应用程序复制到不同位置,但不更改 deploymentProvider
属性,则尝试下载应用程序时 ClickOnce 仍将引用原始位置。

如果希望移动或复制应用程序,则必须也更新 deploymentProvider
路径,这样客户端才能确实从新位置安装。对“安装的”应用程序来说这是个普遍问题。对于始终通过原始 URL
启动的联机应用程序,deploymentProvider 为可选设置。如果设置了
deploymentProvider,则使用该属性,否则将使用用于激活应用程序的 URL 作为基 URL 下载应用程序文件。

请记住:每次更新清单时,必须再次对它签名。

应用程序启动和更新问题

问题:浏览至一个 .application 文件时无任何反应,或者 XML 呈现在 IE
中,或者出现“运行/另存为”对话框

解决方法:很可能是因为 MIME 类型未在服务器或客户端上正确注册。

首先进行检查,以确保服务器配置为将 .application 扩展名与 MIME
类型“application/x-ms-application”相关联(请参见上面的“服务器配置”了解详细信息)。如果服务器配置正确,则检查以确保计算机上安装了
.NET Framework 2.0。如果已安装 dnprdnlong 但仍出现该问题,请尝试卸载并重新安装 Framework,以在客户端重新注册 MIME
类型。

问题:错误对话框显示“无法检索应用程序。部署中缺少文件”或“应用程序下载中断,请检查网络错误并稍后再试”

解决方法:这表示无法下载 ClickOnce 清单所引用的一个或多个文件。调试此问题最简单的方法是尝试下载 ClickOnce 指出其无法下载的
URL。可能的原因如下:

  • 如果日志文件显示“(403) Forbidden”或“(404) Not found”,请检查以确保 Web
    服务器配置为不阻止此文件的下载(请参见上面的“服务器配置”部分)。
  • 如果服务器阻止了 .config 文件,请参见下面的“问题:安装具有 .config 文件的 ClickOnce 应用程序时发生下载错误”。
  • 请检查是否由于部署清单中的 deploymentProvider URL 指向的位置不是用于激活应用程序的 URL
    而导致了此问题(有关更多信息,请参见上面的“使用部署提供程序的注意事项”)。
  • 请检查服务器以确保所有文件都存在;ClickOnce 日志会指出找不到的文件。
  • 检查是否存在网络连接问题;如果下载期间客户端计算机脱机,您将收到此消息。

问题:安装具有 .config 文件的 ClickOnce 应用程序时发生下载错误

基于 Visual Basic Windows 的应用程序默认包含一个 app.config 文件。当用户尝试从安装有 Windows Server
2003 的 Web 服务器安装时将出现问题,原因是该操作系统会出于安全原因而阻止安装 .config 文件。要允许安装 .config
文件,请单击“发布选项”对话框中的“使用‘.deploy’文件扩展名”。

还需要相应地设置 MIME 类型。如果在使用 IIS,请在 Windows
资源管理器中右击“我的电脑”,再选择“管理”。依次打开“服务和应用程序”、“Internet 信息服务”,再右击“网站”,然后选择“属性”。

单击标签为“MIME 类型”的按钮。在“MIME 类型”对话框中,为 .application、.manifest 和 .deploy 文件添加 MIME
类型。

有关更多信息,请参见上面的“服务器配置”部分中的“启用锁定文件扩展名的下载”。

问题:错误信息“应用程序格式不正确”;日志文件包含“XML 签名无效”

解决方法:确保更新了清单文件并再次对它签名。使用 Visual Studio 重新发布应用程序,或使用 Mage
再次对该应用程序进行签名。

问题:安全警告“应用程序已被阻止,因为它会对计算机造成很高的安全风险”

解决方法:如果 Internet 上未签名的应用程序请求升级的信任,通常会出现此对话框。若要允许安装和运行此应用程序,请将该 URL
添加到受信任站点列表。可以在 Internet Explorer 中使用“Internet 选项”对话框中的“安全”选项卡完成此操作。

问题:我在服务器上更新了应用程序,但客户端不下载更新

解决方法:可能存在以下原因之一

  • 请检查部署清单中的 deploymentProvider URL。您是否确定更新内容所在的位置与
    deploymentProvider 指向的位置相同?(有关更多信息,请参见上面的“使用部署提供程序的注意事项”。)
  • 请检查部署清单中的更新间隔。如果设置的间隔为阶段性间隔(例如每六小时一次),ClickOnce
    会一直等到此间隔过后才检查更新。可以更改清单,使之在每次应用程序启动时检查更新。在开发时可以使用这一选项方便地验证是否正在安装更新,但这会减慢应用程序的激活速度。
  • 尝试从“开始”菜单重新启动应用程序。ClickOnce 可能已在后台检测到更新,但将在下次激活时提示您安装。

问题:更新期间遇到错误,日志项记录“部署中的引用与应用程序清单中定义的标识不匹配”

解决方法:发生问题的原因可能是 ClickOnce 当前使用的是 Internet Explorer
缓存的较旧版本的部署清单,而该版本与服务器上的最新应用程序清单不匹配。为避免此问题,建议将服务器 vroot(或部署清单)上的 IIS
设置更改为立即过期,此设置会强制在每次激活时检查服务器。若要在 inetmgr 中进行此操作,请选择 vroot“属性”页上的“HTTP
标头”选项卡,然后选中“启用内容过期”框,并设置为“立即过期”。

或者,可以先重新启动 Internet Explorer 或清除 Internet Explorer 的“Temporary Internet
Files”文件夹,然后再次运行该应用程序,这将导致一次服务器重新同步。

问题:首次从本地磁盘(或 CD-ROM)激活成功,但之后从“开始”菜单激活失败

解决方法:ClickOnce 使用部署提供程序 URL 获取应用程序的更新。请检查以确保该 URL
指向的位置正确。(有关更多信息,请参见上面的“部署提供程序”。)

问题:错误“无法终结应用程序”

解决方法:此错误信息通常表示将该应用程序安装到 ClickOnce
存储区时出错。要么是应用程序出错,要么是存储区损坏。日志文件对出错位置可能会有更好的指示。

要检查的内容:

  • 检查部署清单的标识、应用程序清单的标识和主应用程序 EXE 的标识是否都唯一。
  • 如果应用程序包含的文件路径过长(超过 100
    个字符),则可能超出了存储区的最大路径限制。请尝试缩短路径并重新安装。

问题:应用程序配置文件中的 PrivatePath 设置不起作用

解决方法:要使用
PrivatePath(合成探测路径),应用程序需要获得完全信任权限。请尝试将应用程序清单更改为请求完全信任,然后重试。

问题:卸载期间出现对话框“未能卸载应用程序”

解决方法:这通常表示应用程序已经删除或存储区已损坏。单击“确定”后,“添加/删除程序”项将被删除。

问题:安装期间出现对话框,提示没有安装平台依赖项

解决方法:GAC(全局程序集缓存)中缺少应用程序运行所需的一个必备项。

使用 Visual Studio 发布

问题:在 Visual Studio 中发布时失败

请确保您具备面向目标服务器的发布权限。例如,如果您作为普通用户而不是管理员登录到终端服务器计算机,则您可能没有权限发布到本地 Web 服务器。

如果使用 URL 发布,请确保目标计算机上启用了 FrontPage 服务器扩展。

使用 Mage

问题:我尝试使用证书存储区中的证书进行签名,但收到一个空白消息框

您需要在“签名”对话框中执行以下操作:

  • 选择“使用存储的证书进行签名”,然后
  • 从列表中选择一个证书;不会自动选择第一个证书。

问题:单击“不签名”按钮时导致异常

这是一个已知 bug。所有 ClickOnce
清单都需要进行签名。只需选择其中一个签名选项,然后单击“确定”即可