【问题标题】:ClickOnce: How do I pass a querystring value to my app *through the installer*?ClickOnce:如何*通过安装程序*将查询字符串值传递给我的应用程序?
【发布时间】:2020-04-13 23:58:30
【问题描述】:

我的公司目前为我们所有的客户构建单独的 MSI,即使该应用程序是 100% 相同的(除了一个例外,app.config 中的 ID)。

我想向他们展示我们可以使用 ClickOnce 一次性发布,并且只需为每个客户端的安装程序添加一个查询字符串参数。

示例:http://mysite.com/setup.exe?ID=1234-56-7890

我遇到的问题是上述(“ID = 1234 ...”)没有传递给“myapplication.application”。相反,应用程序安装成功,并且第一次使用激活上下文运行,但“ActivationUri”不包含任何查询字符串值。

有没有办法将查询字符串值从安装程序 URL 传递到应用程序的启动 URL?如果有,怎么做?

【问题讨论】:

    标签: installation clickonce query-string


    【解决方案1】:

    经过大量搜索(和讨论)后,答案很简单,即当前版本的 ClickOnce 不能以这种方式工作。安装程序不会将 URL 传递给首次运行的应用程序。

    这是我为解决方法所做的(效果很好)。

    • 更改我的安装程序包以使所有必需的文件都未压缩且松散(与使用 CAB 文件或将它们嵌入安装程序相反)。

    • 制作一个 ASP.NET 应用程序(使用路由处理 URL)来侦听对“mysite.com/Installer/00123/Setup.exe”的请求

      • 注意:路由应侦听“/Installer/{ID}/*”,其中 {ID} 为 5 位数字。
      • 实际上没有名为“00123”的目录,而是我使用 ASP.NET Routing 来获取这些请求,然后将其映射到包含安装程序文件的实际目录。
    • 然后我劫持请求(解析 setup.exe 以找到嵌入的 URL,该 URL 告诉安装程序在哪里可以找到其余文件...然后我将“/00000/”替换为用户的请求 URL转到 - 在本例中为“00123”。

      • 在请求每个文件时,我知道要发送文件的哪个“版本”,因为 ClickOnce 安装程序将寻找“mysite.com/Installer/00123/SomeFile.dll”(或其他)。李>

    您可以使用 GUID,而不是使用 5 位数的 ID...这取决于您。

    此解决方案非常适合我们的组织...我们目前有 37 个客户需要对其安装程序包进行独特的自定义,但我们只需要实际构建和发布 ONE 安装程序包,然后只需使用劫持方法如上。

    此时,我们有可以交换的占位符,以便为我们想要的任意数量的客户轻松自定义安装程序。

    示例:在 app.config 文件中,我们有 displayName="{OrgName}" 自动替换为数据库中的值之一。

    【讨论】:

    • 你有什么建议可以关注problem
    【解决方案2】:

    对我来说,“http://mysite.com/myapplication.application?id=1234-56-7890”似乎可以解决问题。

    【讨论】:

    • 确实,URL 会发送到应用程序,但不会发送到安装程序。
    【解决方案3】:

    我知道这已经过时了,但我只想提供当前的解决方案。

    在 ClickOnce 应用程序中检索查询字符串参数:

    1. 将 app/download/setup 链接指向应用程序(扩展名为 .application),而不是“setup.exe”
    2. 将此函数添加到您的 ClickOnce 应用程序以检索查询字符串参数集合:
    private NameValueCollection GetQueryStringParameters()
    {
        NameValueCollection nameValueTable = new NameValueCollection();
    
        if (ApplicationDeployment.IsNetworkDeployed)
        {
            string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
            nameValueTable = HttpUtility.ParseQueryString(queryString);
        }
    
        return (nameValueTable);
    }
    
    1. 然后获取查询字符串参数值:
    var querystringParams = GetQueryStringParameters();
    string param_value = querystringParams["param_name"];
    
    1. 不要忘记使用:
    using System.Collections.Specialized;
    using System.Deployment.Application;
    using System.Web;
    

    来源:https://docs.microsoft.com/en-us/visualstudio/deployment/how-to-retrieve-query-string-information-in-an-online-clickonce-application?view=vs-2019

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2021-01-26
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多