如何:在联机 ClickOnce 应用程序中检索查询字符串信息
“查询字符串”是以问号 (?) 开头的 URL 的一部分,其中包含 name=value 形式的任意信息。 假设您有一个名为 WindowsApp1 的 ClickOnce 应用程序,它承载在 servername 上。您希望在应用程序启动时,为变量 username 传入一个值。 您的 URL 可能类似于:
https://servername/WindowsApp1.application?username=joeuser
下面两个过程演示如何使用 ClickOnce 应用程序来获取查询字符串信息。
备注
仅可在应用程序启动时,使用 HTTP 以查询字符串的形式传递信息,而不可使用文件共享或本地文件系统来传递。
第一个过程演示了 ClickOnce 应用程序如何在启动时,使用一小段代码来读取这些值。
第二个过程演示如何使用 MageUI.exe 来配置 ClickOnce 应用程序,使其可以接受查询字符串参数。 只要发布了应用程序就需如此处理。
备注
在决定启用此功能之前,请参见本主题后面的“安全性”部分。
有关如何使用 Mage.exe 或 MageUI.exe 创建 ClickOnce 部署的信息,请参见演练:手动部署 ClickOnce 应用程序。
备注
在 .NET Framework 3.5 SP1 中启动,可能会将命令行参数传递给脱机 ClickOnce 应用程序。如果要为应用程序提供实参,您可以向扩展名为 .APPREF-MS 的快捷方式文件传入形参。
从 ClickOnce 应用程序中获取查询字符串信息
将下面的代码放置在项目中。 为使此代码正常运行,您必须引用 System.Web,并为 System.Web、System.Collections.Specialized 和 System.Deployment.Application 添加 using 或 Imports 语句。
Private Function GetQueryStringParameters() As NameValueCollection Dim NameValueTable As New NameValueCollection() If (ApplicationDeployment.IsNetworkDeployed) Then Dim QueryString As String = ApplicationDeployment.CurrentDeployment.ActivationUri.Query NameValueTable = HttpUtility.ParseQueryString(QueryString) End If GetQueryStringParameters = NameValueTable End Function
private NameValueCollection GetQueryStringParameters() { NameValueCollection nameValueTable = new NameValueCollection(); if (ApplicationDeployment.IsNetworkDeployed) { string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query; nameValueTable = HttpUtility.ParseQueryString(queryString); } return (nameValueTable); }
调用先前定义的函数,通过按名称索引来检索查询字符串参数的 Dictionary。
使用 MageUI.exe 在 ClickOnce 应用程序中启用查询字符串传递
打开 .NET 命令提示窗口并键入:
MageUI
从**“文件”菜单中选择“打开”**,然后打开 ClickOnce 应用程序的部署清单,该清单是以 .application 扩展名结尾的文件。
在左侧导航窗口中选择**“部署选项”面板,然后选中“允许向应用程序传递 URL 参数”**复选框。
从**“文件”菜单中选择“保存”**。
备注
或者,也可以在 Visual Studio 中启用查询字符串传递。打开“项目属性”,选择“发布”选项卡,单击“选项”按钮,选择“清单”,找到并选中“允许向应用程序传递 URL 参数”复选框。
可靠编程
在使用查询字符串参数时,必须慎重考虑如何安装和激活应用程序。 如果将应用程序配置为从 Web 或网络共享安装在用户的计算机上,则用户可能会通过 URL 只激活一次应用程序。 此后,用户通常会使用**“开始”**菜单中的快捷方式来激活应用程序。 因此,能保证您的应用程序在其生存期中只接收查询字符串参数一次。 如果选择将这些参数存储在用户的计算机上以备将来之用,则由您负责以一种安全的方式来存储它们。
如果您的应用程序只能联机使用,则其将总是通过 URL 激活。 但是,即使在这种情况下,您的应用程序也必须编写为在缺少查询字符串参数或查询字符串参数损坏的情况下能够正常运行。
安全性
仅当计划在使用 ClickOnce 应用程序之前,先清除输入的所有恶意字符时,才允许向该程序传递 URL 参数。 例如,如果在对数据库的 SQL 查询中使用了未经筛选的字符串,则其中嵌入了引号、斜杠或分号的字符串可能会执行任意数据操作。 有关查询字符串安全性的更多信息,请参见Script Exploits Overview。