如何在生产中配置 WCF 客户端?

Posted

技术标签:

【中文标题】如何在生产中配置 WCF 客户端?【英文标题】:How do you configure a WCF client in production? 【发布时间】:2011-11-15 15:56:54 【问题描述】:

有许多关于 WCF 和配置(编程和通过 app.config)的可用资源。但是,我还没有看到关于此配置的实际管理的良好资源,尤其是在生产环境中。

WCF 的强大之处在于该框架允许通过 app.config 文件进行配置,这样您就可以调整各种设置而无需重新编译代码。

在安装 WCF 客户端时,如何轻松配置客户端以指向正确的服务器?这可能是我在安装后能想到的最常见的配置。在某些情况下,假设我发布了一个具有服务器组件和客户端组件的产品。客户可以在任何地方安装。虽然 xml 文件在开发后配置方面非常强大,但它根本不是用户友好的。鉴于配置文件中可能有几十个端点,管理员或最终用户是否必须手动更改所有端点?我知道我可以以编程方式完成所有事情,但我实际上是在重新实现所有开箱即用的管道。

上面的问题,更笼统的是:如何在不重新实现框架提供的内容的情况下,通过一些基本的 UI 来简化 WCF 配置?

【问题讨论】:

如果你真的不喜欢配置文件,你总是可以在这个 app.config 之上编写一个配置应用程序。毕竟解析和编写并不难。 如果您是企业级企业,请查看SO-AWARE @Carsten 我认为配置应用程序有点矫枉过正。调整缓冲区大小等低级设置有望解决问题。不过,像更改托管服务的服务器名称这样简单的事情要常见得多。 @marc_s 类似的评论也适用,SO-AWARE 对于可能是单个应用程序的情况来说似乎更加矫枉过正。 【参考方案1】:

您可以使用settings framework 来存储端点地址。您可以轻松读取和保存设置,它们将存储在%APPDATA% 位置,因此您无需担心权限问题。您只需要一个小的配置 UI,用户可以在其中输入服务器名称。通过向您的服务器添加一个简单的 Hello 服务来验证该配置,并尝试在该 UI 中访问该服务。因此,如果服务器地址正确,您可以立即给用户反馈。

另一种选择是实施发现协议。一个相关的问题是here。

【讨论】:

我的问题不是关于如何提示/存储设置,而是更多关于如何修改 WCF 在运行时读取的配置(即,我已经存储了设置,如何让 WCF 感知)。 【参考方案2】:

如果您想要用户友好的安装,您将使用一些安装程序,您只需在其中设置一些配置值。检查作为 Visual Studio 一部分提供的安装程序项目或更强大(也更复杂)WiX。如果您没有安装程序,则您已经选择了用户应该手动配置所有内容。

如果您唯一的问题是服务地址,并且您计划将服务和客户端部署到单个 LAN,您还可以添加 WS-Discovery (available in WCF 4),让客户端能够在网络上找到服务。

【讨论】:

安装时间是有意义的,尽管必须手动替换 app.config 文件中的元素似乎很乏味和/或容易出错(尤其是在安装程序中)。您对如何执行此操作或(更好)如何在运行时执行此操作有任何建议吗?发现是一个好点,尽管在我的场景中不可行(通过 WAN)。 如果您想在运行时执行此操作,您将编写自己的配置工具——主应用程序的一部分或主应用程序附带的第二个应用程序。我不认为标准的 WCF 配置工具可以随您的应用程序一起提供。 无论如何我都不想发布标准的 WCF 配置工具——从最终用户的角度来看,那将是一场噩梦。本质上,我只想在运行时替换 app.config 文件中客户端配置的端点主机名。从它的声音来看,没有内置的方法可以做到这一点。我正在考虑在创建频道时覆盖 EndpointAddress 属性 - 我认为这是我最好的选择。【参考方案3】:

如果您想拥有/制作一个漂亮的 UI 来编辑这些设置,则需要将该 UI 中的用户输入保存在某处,并且您必须在客户端上创建服务调用或设置托管时使用它服务器上的服务。我个人会存储在数据库中,并使用它们在运行时通过编码方法配置 WCF 端点。

这也有一些优点,都备份了数据库备份,远程连接和检查,更新时没有覆盖文件的风险等等。

如果您的设置/应用程序没有数据库,那么配置文件也可以,并且可能是唯一的方法,无论如何我都不会在注册表中保存任何内容。

【讨论】:

我的问题不是关于如何提示/存储设置,而是更多关于如何修改 WCF 在运行时读取的配置(即,我已经存储了设置,如何让 WCF 感知)。

以上是关于如何在生产中配置 WCF 客户端?的主要内容,如果未能解决你的问题,请参考以下文章

基于证书的认证基础

如何配置客户端以在 Fiddler 中捕获本地 WCF 请求?

WCF系列如何配置和承载服务

如何使用多个绑定将 WCF json 绑定到 https?

从 .Net 2.0 客户端调用 WCF 服务时如何配置安全性

如何将单个 WCF 服务配置为具有多个 HTTP 和 HTTPS 端点?