.net 为ClickOnce部署自定义app.config

.net 为ClickOnce部署自定义app.config,.net,clickonce,.net,Clickonce,我们开发了一个用于企业环境的.NET4客户端应用程序(Windows窗体)。客户端应该以多种不同的风格发布,这让我们有些头疼。其中一个要求是,客户机必须能够通过soapweb服务与许多不同的应用程序服务器通信。应用服务器(AS)发布相同的WS-Interface,但底层服务器系统不同,通常我们的企业为每个客户提供一个实例。其次,我们有一个内部运营部门,该部门还必须能够访问所有这些应用程序服务器,以支持我们的客户 网络结构是这样的:在内部,AS服务器位于10.0.0.0/8网络上,而所有客户都有公

我们开发了一个用于企业环境的.NET4客户端应用程序(Windows窗体)。客户端应该以多种不同的风格发布,这让我们有些头疼。其中一个要求是,客户机必须能够通过soapweb服务与许多不同的应用程序服务器通信。应用服务器(AS)发布相同的WS-Interface,但底层服务器系统不同,通常我们的企业为每个客户提供一个实例。其次,我们有一个内部运营部门,该部门还必须能够访问所有这些应用程序服务器,以支持我们的客户

网络结构是这样的:在内部,AS服务器位于10.0.0.0/8网络上,而所有客户都有公共IP地址来访问应用服务器。目前我们通过IP访问,但正在迁移到使用DNS名称,尽管服务器的DNS名称对于内部和外部(客户)访问将不相同

这样做的结果是,app.config中有许多不同的配置需要管理,因为默认情况下WS-connection信息存储在那里。我之前发布了一个相关的问题(),这对我们帮助很大,但我们仍在努力改进配置管理。如参考文章中所述,如果您熟悉Maven(Java),我们现在可以为每个端点连接设置不同的配置/构建,类似于概要文件

现在的问题是,由于我们使用ClickOnce部署并允许用户通过URL进行安装,我们需要部署许多不同的变体,例如,对于单个AS,我们至少需要两个部署/构建,一个使用公共IP端点,另一个使用内部IP端点。将其与大量的AS服务器相乘,很容易看出这需要我们处理大量的构建配置。显然还有改进的余地

我们考虑的一些想法和选择是:

  • 跳过端点配置,至少跳过app.config中的地址部分,并让用户在设置表单中对其进行软配置。我们的经验是,它也不是没有问题的,通常它需要终端用户的支持,他们很容易出错

  • 定制安装程序,研究是否有任何方法可以动态配置端点,例如,由于客户端应用程序将部署在发布web服务的同一服务器上,安装能否以某种方式获取源URL并使用该URL定位as服务器

任何关于如何改进部署过程和其他相关经验的想法都是非常受欢迎的。我想我们不是第一个遇到这个问题的人

此外,如果存在更好的方法,我们愿意跳过ClickOnce部署


首先,您可以自定义app.config,然后使用mage.exe自定义发布,也就是说,您不必使用Visual Studio进行发布。您提到您不想发布许多不同的客户机,但这些知识可能有助于您对流程的思考


其次,我建议您发布一个目录服务。这是一个web服务(发布到预先确定的位置,这意味着您可以将端点地址烘焙到您的应用程序中),您可以通过传递足够的参数来查询它,以标识正在调用的用户/客户端,并且它可以返回您需要调用的实际web服务接口的URI。目录服务可以确定您从何处呼叫(它可以确定您的IP),因此它知道您是在内部呼叫还是在外部呼叫,并基于此返回相应的IP。

首先可以自定义您的app.config,然后使用mage.exe自定义发布它,也就是说,您不必使用Visual Studio进行发布。您提到您不想发布许多不同的客户机,但这些知识可能有助于您对流程的思考


其次,我建议您发布一个目录服务。这是一个web服务(发布到预先确定的位置,这意味着您可以将端点地址烘焙到您的应用程序中),您可以通过传递足够的参数来查询它,以标识正在调用的用户/客户端,并且它可以返回您需要调用的实际web服务接口的URI。目录服务可以确定您从何处呼叫(它可以确定您的IP),因此它知道您是在内部呼叫还是在外部呼叫,并据此返回相应的IP。

我非常喜欢slugster关于目录服务的想法。让客户询问要呼叫哪种服务可以让您保持灵活性,并且如果您更改某些客户需要呼叫哪种服务,您就不必重新部署客户


也就是说,您可能仍然有复杂的配置。返回到自定义app.config。你可以用这个。它是一个第三方构建工具(免责声明:我构建了它),用于在VisualStudio之外构建ClickOnce部署。更重要的是,它有一个宏系统,允许您设置多个配置。您可以从命令行生成它,指定要生成的配置。基于该配置,它可以替换app.config中的不同值,或者干脆选择一个不同的app.config文件。有关宏系统的更多详细信息,请参阅。

我非常喜欢slugster关于目录服务的想法。让客户询问要呼叫哪种服务可以让您保持灵活性,并且如果您更改某些客户需要呼叫哪种服务,您就不必重新部署客户

也就是说,您可能仍然有复杂的配置。返回到自定义app.config。你可以用这个。它是一个第三方构建工具(免责声明:我构建了它)