对我来说,“http://mysite.com/myapplication.application
我的公司目前为所有客户构建单独的MSI,即使该应用程序在各个方面都是100%相同(唯一的例外是app.config中的ID)。
我想向他们展示我们可以使用ClickOnce在同一位置发布,只需为每个客户端的安装程序添加查询字符串参数。
示例:http://mysite.com/setup.exe?ID=1234-56-7890
我遇到的问题是上述(“ ID = 1234 ...”)没有传递给“ myapplication.application”。相反,正在发生的情况是,该应用程序已成功安装,并且首次使用激活上下文运行,但是“ ActivationUri”不包含任何查询字符串值。
是否可以将查询字符串值从安装者的URL传递到应用程序的启动URL?如果是这样,如何?
经过大量搜索(并讨论),答案很简单,即当前版本的ClickOnce无法那样工作。安装程序不会在首次运行时将URL传递到应用程序。
以下是我为解决此问题所做的事情(效果很好)。
更改我的安装程序包,使所有必需的文件都解压缩并丢失(与使用CAB文件或将其嵌入安装程序有关。)]] >>
制作一个ASP.NET应用程序(使用路由进行URL处理),以侦听对“ mysite.com/Installer/00123/Setup.exe”的请求]
然后我劫持了请求(解析setup.exe以找到告诉安装程序在哪里可以找到其余文件的嵌入式URL。然后,我用请求URL替换“ / 00000 /”,用户访问了-在这种情况下为“ 00123”。
代替使用5位数的ID,您可以使用GUID ...由您决定。
此解决方案非常适合我们的组织...我们目前有37个客户,他们需要对其安装程序包进行独特的自定义,但是我们只需要实际构建和发布ONE安装程序包,并只需使用上面的hijack方法即可。
目前,我们有一些占位符,我们可以交换掉它们,这样就可以轻松地为所需的客户端自定义安装程序。
示例:在app.config文件中,我们具有displayName =“ {OrgName}”,该名称将自动替换为数据库中的值之一。
对我来说,“http://mysite.com/myapplication.application
我知道这已经过时了,但是我只想提供当前的解决方案。
要在ClickOnce应用程序中检索查询字符串参数:
private NameValueCollection GetQueryStringParameters()
{
NameValueCollection nameValueTable = new NameValueCollection();
if (ApplicationDeployment.IsNetworkDeployed)
{
string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
nameValueTable = HttpUtility.ParseQueryString(queryString);
}
return (nameValueTable);
}
- 然后获取查询字符串参数值:
var querystringParams = GetQueryStringParameters();
string param_value = querystringParams["param_name"];
- 不要忘记使用方法:
using System.Collections.Specialized;
using System.Deployment.Application;
using System.Web;
对我来说,“http://mysite.com/myapplication.application
我知道这已经过时了,但是我只想提供当前的解决方案。