在 ClickOnce 应用程序中访问本地数据和远程数据

更新:2007 年 11 月

大多数应用程序都使用或产生数据。ClickOnce 提供了多种在本地和远程读写数据的选项。

本地数据

通过 ClickOnce,可以用以下任一种方法在本地加载和存储数据:

  • ClickOnce 数据目录

  • 独立存储

  • 其他本地文件

ClickOnce 数据目录

本地计算机上安装的每个 ClickOnce 应用程序都有一个数据目录,该目录存储在用户的 Documents and Settings 文件夹中。安装应用程序时,ClickOnce 应用程序中包含的所有标记为“数据”文件的文件都会复制到此目录中。数据文件可以是任何文件类型,最常用的是文本、XML 和数据库文件(如 Microsoft Access .mdb 文件)。

数据目录用于保存应用程序托管的数据,即应用程序显式存储和维护的数据。应用程序清单中所有未标记为“data”的静态非依赖文件都位于应用程序目录中。此目录是应用程序的可执行文件 (.exe) 和程序集所在的位置。

d8saf4wy.alert_note(zh-cn,VS.90).gif说明:

卸载 ClickOnce 应用程序时,会同时移除其数据目录。切勿使用数据目录存储最终用户托管的数据,如文档。

在 ClickOnce 分发中标记数据文件

若要将现有文件放置在数据目录中,必须在 ClickOnce 应用程序的应用程序清单文件中将其标记为数据文件。有关更多信息,请参见如何:将数据文件包括到 ClickOnce 应用程序中

读取和写入数据目录

读取数据目录要求 ClickOnce 应用程序请求读权限;同样,写入目录要求写权限。如果应用程序配置为以“完全信任”状态运行,则应用程序将自动拥有此权限。有关使用“权限提升”或“受信任的应用程序部署”来提升应用程序权限的更多信息,请参见 ClickOnce 部署和安全

d8saf4wy.alert_note(zh-cn,VS.90).gif说明:

如果组织不使用“受信任的应用程序部署”,并禁用“权限提升”,则断言权限将会失败。

应用程序具有这些权限后,就可以使用 System.IO 中的类的方法调用来访问数据目录。您可以使用在 ApplicationDeploymentCurrentDeployment 属性上定义的 DataDirectory 属性,在 Windows 窗体 ClickOnce 应用程序中获取数据目录的路径。这是最方便的也是推荐的访问数据的方式。下面的代码示例演示如何对作为数据文件包含在部署中的名为 CSV.txt 的文本文件执行此操作。

If (ApplicationDeployment.IsNetworkDeployed) Then
    Dim SR As StreamReader = Nothing

    Try
        SR = New StreamReader(ApplicationDeployment.CurrentDeployment.DataDirectory & "\CSV.txt")
        MessageBox.Show(SR.ReadToEnd())
    Catch Ex As Exception
        MessageBox.Show("Could not read file.")
    Finally
        SR.Close()
    End Try
End If

有关将部署中的文件标记为数据文件的更多信息,请参见如何:将数据文件包括到 ClickOnce 应用程序中

此外,还可以使用 Application 类中的相关变量(如 LocalUserAppDataPath)来获取数据目录路径。

操作其他类型的文件可能需要附加权限。例如,如果您要使用 Access 数据库 (.mdb) 文件,则应用程序必须断言完全信任才能使用相关的 System.Data 类。

数据目录和应用程序版本

每一版本的应用程序都有它自己的、独立于其他版本的数据目录。无论部署中是否包含任何数据文件,ClickOnce 都会创建此目录,以便应用程序在运行时拥有创建新数据文件的位置。安装新版本的应用程序时,无论上一版本的数据目录中的所有现有数据文件是包含在原始部署中,还是由应用程序创建,ClickOnce 都会将其复制到新版本的数据目录中。

如果旧版本应用程序中的数据文件与新版本应用程序中的数据文件具有不同的哈希值,ClickOnce 将使用服务器上的新版文件替换较旧版本的文件。同样,如果较早版本的应用程序创建了新文件,并且其名称与新版本的部署中包含的文件相同,ClickOnce 也将使用新文件覆盖旧版本的文件。在这两种情况下,旧文件都保存在数据目录的 .pre 子目录中,这样应用程序仍然可以出于迁移的目的访问以前的数据。

如果需要较细粒度的数据迁移,可以使用 ClickOnce 部署 API 执行从以前的数据目录到新数据目录的自定义迁移。您必须使用 IsFirstRun 测试可用的下载,使用 UpdateUpdateAsync 下载更新,并在完成更新后自己执行任何自定义数据迁移工作。

独立存储

独立存储通过使用简单的 API 提供用于创建和访问文件的 API。所存储文件的实际位置对于开发人员和用户均是隐藏的。

独立存储在所有版本的 .NET Framework 中都有效。无需授予更多权限,独立存储在部分信任的应用程序中也有效。如果应用程序必须以部分信任级别运行,但又必须维护应用程序特定的数据,则应使用独立存储。

有关更多信息,请参见独立存储介绍

其他本地文件

如果应用程序必须操作或保存最终用户数据(如报表、图像、音乐等等),应用程序将需要 FileIOPermission 才能在本地文件系统中读写数据。

远程数据

有时,应用程序可能需要从远程网站检索信息,如客户数据或市场信息。本节讨论了检索远程数据的最常见技术。

使用 HTTP 访问文件

您可以使用 System.Net 命名空间中的 WebClientHttpWebRequest 类来访问 Web 服务器的数据。该数据既可以是静态文件,也可以是返回原始文本或 XML 数据的 ASP.NET 应用程序。如果数据为 XML 格式,则检索该数据的最快方法是使用 XmlDocument 类,该类的 Load 方法将 URL 作为参数。有关示例,请参见将 XML 文档读入 DOM

当应用程序通过 HTTP 访问远程数据时,必须考虑安全性。默认情况下,可能会限制 ClickOnce 应用程序对网络资源的访问,具体取决于应用程序的部署方式。应用这些限制是为了防止恶意程序获取对被授予特权的远程数据的访问,或防止恶意程序使用用户的计算机攻击网络上的其他计算机。

下表列出了可以使用的部署策略及其默认 Web 权限。

部署类型

默认网络权限

Web 安装

只能访问安装应用程序的 Web 服务器

文件共享安装

无法访问任何 Web 服务器

CD-ROM 安装

可以访问任何 Web 服务器

如果 ClickOnce 应用程序由于安全限制而无法访问 Web 服务器,则应用程序必须对该网站断言 WebPermission。有关增加 ClickOnce 应用程序的安全权限的更多信息,请参见 ClickOnce 部署和安全

通过 XML Web services 访问数据

如果将数据公开为 XML Web services,则可以使用 XML Web services 代理访问该数据。该代理是用 Visual Studio 或 Web 服务描述语言工具 (Wsdl.exe) 创建的 .NET Framework 类。XML Web services 的操作(如检索客户、下订单等等)以该代理中的方法的形式公开。这样使 Web 服务的易用性相对于原始文本或 XML 文件大大提高。

如果 XML Web services 通过 HTTP 进行操作,它将受到与 WebClientHttpWebRequest 类相同的安全限制的约束。

有关创建 XML Web services 代理的示例,请参见生成 XML Web services 客户端。还可以使用 Visual Studio 执行此任务。有关更多信息,请参见如何:添加和移除 Web 引用如何:添加和移除 Web 引用如何:添加和移除 Web 引用.

直接访问数据库

您可以使用 System.Data 命名空间中的类,建立与网络上的数据库服务器(如 SQL Server)的直接连接,但必须考虑安全性问题。与 HTTP 请求不同,在部分信任状态下,数据库连接请求默认情况下始终被禁止;只有从 CD-ROM 安装 ClickOnce 应用程序时,才会默认拥有此权限。这为应用程序提供了完全信任级别。若要启用对特定 SQL Server 数据库的访问,应用程序必须向该数据库请求 SqlClientPermission;若要启用对 SQL Server 以外的数据库的访问,则必须请求 OleDbPermission

大多数情况下,无需直接访问数据库,只需通过用 ASP.NET 编写的 Web 服务器应用程序或 XML Web services 访问即可。如果从 Web 服务器部署 ClickOnce 应用程序,以这种方式访问数据库通常是最好的方法。无需提升应用程序的权限即可访问部分信任状态的服务器。

请参见

任务

如何:将数据文件包括到 ClickOnce 应用程序中

其他资源

Windows 窗体应用程序的 ClickOnce 部署