【发布时间】:2010-12-08 14:10:31
【问题描述】:
我正在开发一个大型系统,为此我必须使用 WCF 来访问 Web 服务。我的测试代码工作正常,现在我需要将我的 WCF 客户端代码集成到更大的系统中。我无法添加到现有的“app.config”文件中,并且想指定一个单独的 .config 文件供我的客户端代码使用。
我怎样才能最好地做到这一点?
谢谢!
【问题讨论】:
标签: wcf configuration-files wcf-client
我正在开发一个大型系统,为此我必须使用 WCF 来访问 Web 服务。我的测试代码工作正常,现在我需要将我的 WCF 客户端代码集成到更大的系统中。我无法添加到现有的“app.config”文件中,并且想指定一个单独的 .config 文件供我的客户端代码使用。
我怎样才能最好地做到这一点?
谢谢!
【问题讨论】:
标签: wcf configuration-files wcf-client
不幸的是,WCF 中没有对此的内置支持。您必须自己创建自己的 ChannelFactory 子类并加载/解析配置文件。在 MSDN 论坛上查看this post,了解更多实施细节。
【讨论】:
或者,您可以采用简单易行的方法 - 并按照本文所述实现自定义配置文件,该文件使用 DataSet / DataTable 模型来存储/检索您的配置(包括工作代码):
【讨论】:
你不能随心所欲地做这件事——你可以接近,但不能完全做到。
您可以做的就是将此部分添加到主应用程序的配置文件中:
<system.serviceModel>
<bindings configSource="bindings.config" />
<behaviors configSource="behaviors.config" />
<client configSource="client.config" />
<services configSource="services.config" />
.....
</system.serviceModel>
因此,对于 <system.serviceModel> 中的每个部分,您可以使用 configSource= 属性指定一个外部配置文件(不要让 Visual Studio 的红色波浪线混淆它 - 是的,它确实 工作!)。
您可以对任何配置 section 执行此操作 - 但不幸的是,无法对整个 section group (<system.serviceModel>) 执行此操作。
马克
【讨论】:
所以 marc_s DOES 提到的选项有效。忽略 Visual Studio 警告,它无法识别绑定和所有其他位置的 configSource 属性。
【讨论】:
有 2 个选项。
选项 1. 使用渠道。
如果您直接使用通道,.NET 4.0 和 .NET 4.5 具有 ConfigurationChannelFactory。 MSDN 上的示例如下所示:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "Test.config";
Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
fileMap,
ConfigurationUserLevel.None);
ConfigurationChannelFactory<ICalculatorChannel> factory1 =
new ConfigurationChannelFactory<ICalculatorChannel>(
"endpoint1",
newConfiguration,
new EndpointAddress("http://localhost:8000/servicemodelsamples/service"));
ICalculatorChannel client1 = factory1.CreateChannel();
正如 Langdon 所指出的,您可以通过简单地传入 null 来使用配置文件中的端点地址,如下所示:
var factory1 = new ConfigurationChannelFactory<ICalculatorChannel>(
"endpoint1",
newConfiguration,
null);
ICalculatorChannel client1 = factory1.CreateChannel();
这在 MSDN documentation 中进行了讨论。
选项 2. 使用代理。
如果您使用的是代码生成的代理,您可以读取配置文件并加载ServiceModelSectionGroup。与简单地使用ConfigurationChannelFactory 相比,涉及的工作更多,但至少您可以继续使用生成的代理(在后台使用ChannelFactory 并为您管理IChannelFactory。
Pablo Cibraro 在这里展示了一个很好的例子:Getting WCF Bindings and Behaviors from any config source
【讨论】: