问题 在任何浏览器中将URL参数传递给ClickOnce应用程序


我有一个ClickOnce应用程序,我需要能够将URL参数传递给它。例如,用户可以单击“http://foo.bar/MyApp.application?flavor=grape”形式的URL,这将启动我的应用程序,将“?flavor = grape”查询传递给它。

不幸的是,看起来这只适用于IE开箱即用。在Firefox和Chrome上,用户必须安装附加组件才能使ClickOnce部署正常运行。我的用户在限制性企业环境中工作,不允许安装任何附加组件或其他任何内容(但是ClickOnce确实适用于他们)。那么,我该怎么办?

我能想到的一个黑客就是将我的应用程序注册为一个足够独特的文件扩展名的文件处理程序,例如“.bugmaster”。然后 - 或者我的理论去了 - 我可以让我的网络服务器生成一个名为“flavor_grape.bugmaster”的文件;用户将单击指向该文件的URL,然后选择“运行”而不是“保存”,这将启动我的应用程序,然后他将解析URL参数的文件名。不幸的是,这种方法也不起作用。当从本地文件系统打开“flavor_grape.bugmaster”文件时,它完全正常,但由于某种原因,当用户尝试从浏览器打开文件时,这不起作用。

有没有人有任何其他想法?


1837
2018-06-12 23:05


起源



答案:


ClickOnce有一个漂亮的小技巧,你可以直接将参数编码到setup.exe使用的URL中。例如,要创建包含“flavor = grape”参数的setup.exe,可以从命令行运行以下命令:

copy setup.exe setup-for-grape.exe
setup.exe -url="http://foo.bar/MyApp.application?flavor=grape" /dest=setup-for-grape.exe

这使用未记录的/ dest标志将结果输出到setup-for-grape.exe文件,而不是修改原始setup.exe。执行此操作后,setup-for-grape.exe将指向您的URL  将包含您的flavor = grape参数。请注意,如果您使用签名,则需要执行此操作 未签署 您的setup.exe的副本,然后签名,因为它打破了签名。

如果可能的参数选择数量相当有限,您可以为它们生成setup.exe,并从您的网站链接到它们。

另一方面,如果有无限数量的选择,您可以设置一个Web服务,该服务接收一些参数,生成一个包含所需参数的setup.exe,并将其吐回客户端。我已经使用此方法为连接到特定服务器的客户端生成setup.exe - 客户端安装URL中包含编码的服务器连接信息,因此在安装客户端时,它会自动知道要连接的服务器。

当然,如果您不想使用setup.exe,或者您的限制性企业环境不允许使用它,那么所有这一切都会直接显示在窗口之外。但希望你会发现它很有用,或至少提供信息。


11
2018-06-12 23:34



哇!你每天都在学习新东西。我已经和ClickOnce合作了一段时间,而且我已经错过了这个选项。 @Marty Dill:你过去使用过这种技术吗? - RLH
对!见我的第二段。我用它来生成setup.exe,其中包含有关要连接的服务器的信息。一旦系统全部启动并运行,它就能很好地工作。 - Marty Dill
这确实是一个巧妙的技巧,但不幸的是,我确实需要无限数量的选项(好吧,我认为技术上它是有限的,但它们超过1e10),我的应用程序确实需要签名。虽然我可以设置Web服务来签署应用程序。不过,这是一个有趣的想法,谢谢! - Bugmaster
是的,你绝对可以通过网络服务进行签名。我不记得我头顶的命令,但这很容易。 - Marty Dill
嗨Marty,我也发现自己需要将参数传递给我的ClickOnce应用程序。应用程序还必须由计划任务运行。您的解决方案看起来很理想,但我不确定签名。您说“如果您正在使用签名,则需要对setup.exe的未签名副本执行此操作,然后在签名后对其进行签名”。我必须签署setup.exe或setup-for-grape.exe,我必须在什么时候签名?当我发布Visual Studio时,它会自动打开“签署ClickOnce清单”选项,那么如何获得未签名的副本? - bgh


答案:


ClickOnce有一个漂亮的小技巧,你可以直接将参数编码到setup.exe使用的URL中。例如,要创建包含“flavor = grape”参数的setup.exe,可以从命令行运行以下命令:

copy setup.exe setup-for-grape.exe
setup.exe -url="http://foo.bar/MyApp.application?flavor=grape" /dest=setup-for-grape.exe

这使用未记录的/ dest标志将结果输出到setup-for-grape.exe文件,而不是修改原始setup.exe。执行此操作后,setup-for-grape.exe将指向您的URL  将包含您的flavor = grape参数。请注意,如果您使用签名,则需要执行此操作 未签署 您的setup.exe的副本,然后签名,因为它打破了签名。

如果可能的参数选择数量相当有限,您可以为它们生成setup.exe,并从您的网站链接到它们。

另一方面,如果有无限数量的选择,您可以设置一个Web服务,该服务接收一些参数,生成一个包含所需参数的setup.exe,并将其吐回客户端。我已经使用此方法为连接到特定服务器的客户端生成setup.exe - 客户端安装URL中包含编码的服务器连接信息,因此在安装客户端时,它会自动知道要连接的服务器。

当然,如果您不想使用setup.exe,或者您的限制性企业环境不允许使用它,那么所有这一切都会直接显示在窗口之外。但希望你会发现它很有用,或至少提供信息。


11
2018-06-12 23:34



哇!你每天都在学习新东西。我已经和ClickOnce合作了一段时间,而且我已经错过了这个选项。 @Marty Dill:你过去使用过这种技术吗? - RLH
对!见我的第二段。我用它来生成setup.exe,其中包含有关要连接的服务器的信息。一旦系统全部启动并运行,它就能很好地工作。 - Marty Dill
这确实是一个巧妙的技巧,但不幸的是,我确实需要无限数量的选项(好吧,我认为技术上它是有限的,但它们超过1e10),我的应用程序确实需要签名。虽然我可以设置Web服务来签署应用程序。不过,这是一个有趣的想法,谢谢! - Bugmaster
是的,你绝对可以通过网络服务进行签名。我不记得我头顶的命令,但这很容易。 - Marty Dill
嗨Marty,我也发现自己需要将参数传递给我的ClickOnce应用程序。应用程序还必须由计划任务运行。您的解决方案看起来很理想,但我不确定签名。您说“如果您正在使用签名,则需要对setup.exe的未签名副本执行此操作,然后在签名后对其进行签名”。我必须签署setup.exe或setup-for-grape.exe,我必须在什么时候签名?当我发布Visual Studio时,它会自动打开“签署ClickOnce清单”选项,那么如何获得未签名的副本? - bgh