如何在单独的dll项目中配置WCF

时间:2009-02-02 11:37:16

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

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

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

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

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

因此您可以删除该文件,因为它未被使用。而是读取库的主机配置,因此这是端点和绑定配置应该唯一的位置。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

有两种选择。

选项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。 / p>

Pablo Cibraro在这里展示了一个很好的例子:Getting WCF Bindings and Behaviors from any config source

答案 5 :(得分:0)

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

就服务配置本身而言,WCF配置可以让人轻松搞定。这是一个过度设计过于复杂的作品。您的应用程序的目标应该是最少依赖于配置,同时保持产品将遇到的部署方案的灵活性。