【问题标题】:How can I specify an alternate config file for a WCF client?如何为 WCF 客户端指定备用配置文件?
【发布时间】:2010-12-08 14:10:31
【问题描述】:

我正在开发一个大型系统,为此我必须使用 WCF 来访问 Web 服务。我的测试代码工作正常,现在我需要将我的 WCF 客户端代码集成到更大的系统中。我无法添加到现有的“app.config”文件中,并且想指定一个单独的 .config 文件供我的客户端代码使用。

我怎样才能最好地做到这一点?

谢谢!

【问题讨论】:

    标签: wcf configuration-files wcf-client


    【解决方案1】:

    不幸的是,WCF 中没有对此的内置支持。您必须自己创建自己的 ChannelFactory 子类并加载/解析配置文件。在 MSDN 论坛上查看this post,了解更多实施细节。

    【讨论】:

      【解决方案2】:

      或者,您可以采用简单易行的方法 - 并按照本文所述实现自定义配置文件,该文件使用 DataSet / DataTable 模型来存储/检索您的配置(包括工作代码):

      (.Net) suggestions on making a config file for a program?

      【讨论】:

        【解决方案3】:

        你不能随心所欲地做这件事——你可以接近,但不能完全做到。

        您可以做的就是将此部分添加到主应用程序的配置文件中:

        <system.serviceModel>
           <bindings configSource="bindings.config" />
           <behaviors configSource="behaviors.config" />
           <client configSource="client.config" />
           <services configSource="services.config" />
          .....
        </system.serviceModel>
        

        因此,对于 &lt;system.serviceModel&gt; 中的每个部分,您可以使用 configSource= 属性指定一个外部配置文件(不要让 Visual Studio 的红色波浪线混淆它 - 是的,它确实 工作!)。

        您可以对任何配置 section 执行此操作 - 但不幸的是,无法对整个 section group (&lt;system.serviceModel&gt;) 执行此操作。

        马克

        【讨论】:

          【解决方案4】:

          所以 marc_s DOES 提到的选项有效。忽略 Visual Studio 警告,它无法识别绑定和所有其他位置的 configSource 属性。

          【讨论】:

          • 欢迎来到 Stack Overflow!谢谢你的帖子!请不要在您的帖子中使用签名/标语。您的用户框算作您的签名,您可以使用您的个人资料发布您喜欢的任何关于您自己的信息。 FAQ on signatures/taglines
          【解决方案5】:

          有 2 个选项。

          选项 1. 使用渠道。

          如果您直接使用通道,.NET 4.0 和 .NET 4.5 具有 ConfigurationChannelFactoryMSDN 上的示例如下所示:

          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

          【讨论】:

          • Philippe - 我发现选项 1 相当容易使用,但您能否就选项 2 提供更多建议。我发现的只是使用反射的不受支持的@generators@ 的数量,并且没有涵盖 100% 的可能配置选项。
          • @GeorgySmirnov,您是否在选项 2 中看到了指向 weblogs.asp.net/cibrax/archive/2010/05/11/… 的链接?它展示了一个很好的例子。
          • 选项 1 很不错 -- 太糟糕了 ConfigurationChannelFactory 的 Dispose 方法和 ChannelFactory 的一样坏,只是这一次类是密封的,所以你不能扩展它来制作一个健全的版本。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-13
          • 2011-05-03
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          相关资源
          最近更新 更多