【问题标题】:How to configure WCF in a separate dll project如何在单独的 dll 项目中配置 WCF
【发布时间】:2009-02-02 11:37:15
【问题描述】:

我正在开发一个使用大量 Web 服务的 Web 应用程序 (ASP.NET 3.5)。我为每个 Web 服务创建了一个单独的 dll 项目:这些项目包含服务引用和客户端代码。

但是,调用网站必须在其 web.config 中包含 <system.serviceModel> 信息(<bindings><client> 节点),即使此信息也在 dll 的 app.config 文件中!我曾尝试将 serviceclass.dll.config 复制到网站的 bin 目录,但这没有帮助。

有没有办法集中配置 WCF 客户端?

【问题讨论】:

标签: asp.net wcf service-reference wcf-configuration


【解决方案1】:

我只有有限的 WCF 经验,都使用 BasicHTTP 绑定。但是我对 WCF 的 xml 文件过敏,并且到目前为止已经设法避免使用它们。我一般不建议这样做,但我将配置详细信息放在我的应用程序现有配置存储中,然后以编程方式应用它们。例如。对于 Web 服务代理,我使用客户端的构造函数,该构造函数采用“绑定”和“端点”,并以编程方式将设置应用于绑定和端点。

这里似乎描述了一个更优雅的解决方案:Reading WCF Configuration from a Custom Location,但我还没有尝试过。

【讨论】:

  • 谢谢。我已经尝试在您提供的链接中进行编码,它完全符合我的要求。
【解决方案2】:

根据我的经验,库项目从不读取 app.config。

所以你可以真正删除文件,因为它没有被使用。取而代之的是读取库的主机配置,因此端点和绑定配置应该是唯一的位置。

【讨论】:

  • 完全正确 - 如果您有一个应用程序托管/使用的 DLL,那么只有应用程序的配置很重要。这是 .NET 的基本设计决定。这就是为什么在单独的项目 DLL 的 app.config 中的设置根本不会被使用.... :-(
【解决方案3】:

可以放弃 xml 配置并在构造函数或自定义“服务工厂”中建立与服务关联的 Binding 和 Endpoint 类。 iDesign 在这方面有一些很好的信息: http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11 (参见 Proc 工厂)

在他们的方法中,您在服务上设置属性以从高层次上指定它们应该如何工作(即 [Internet]、[Intranet]、[BusinessToBusiness]),并且服务工厂根据最佳实践配置服务每个场景。他们的书描述了构建这种服务: http://www.amazon.com/Programming-WCF-Services-Juval-Lowy/dp/0596526997

如果你只是想共享配置 XML config,可以使用 configSource 属性指定配置路径:http://weblogs.asp.net/cibrax/archive/2007/07/24/configsource-attribute-on-system-servicemodel-section.aspx

【讨论】:

    【解决方案4】:

    请记住,配置文件是由具有入口点的可执行文件读取的。库 dll 没有入口点,因此它不是将读取它的程序集。正在执行的程序集必须有一个配置文件可供读取。

    如果您想集中您的网络配置,那么我建议您考虑将它们嵌套在带有虚拟目录的 IIS 中。这将允许您使用配置继承来集中您需要的任何内容。

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案6】:

        首先,类库 (DLL) 没有自己的配置,但是它们可以读取其主机的配置(Web/可执行文件等)。话虽如此,我仍然在库项目中维护一个 app.config 文件作为模板和易于参考。

        就服务配置本身而言,WCF 配置可以很容易地让人大吃一惊。这是一个过度设计的过于复杂的作品。您的应用程序的目标应该是尽可能少地依赖配置,同时保持您的产品将遇到的部署场景的灵活性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-20
          • 2020-10-23
          相关资源
          最近更新 更多