7

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

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

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

4

6 回答 6

4

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

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

于 2009-02-02T12:47:39.813 回答
4

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

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

于 2009-02-02T13:57:59.187 回答
3

可以放弃 xml 配置并在构造函数或自定义“服务工厂”中建立与服务关联的 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-服务模型-section.aspx

于 2009-02-02T13:35:59.200 回答
3

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

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

于 2009-02-02T14:10:22.330 回答
1

有 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文档中进行了讨论。

选项 2. 使用代理。

如果您正在使用代码生成的代理,您可以读取配置文件并加载ServiceModelSectionGroup。与简单地使用相比,涉及的工作更多,ConfigurationChannelFactory但至少您可以继续使用生成的代理(在后台使用 aChannelFactoryIChannelFactory为您管理。

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

于 2013-04-16T19:14:46.103 回答
0

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

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

于 2013-01-11T00:10:53.493 回答