7

我有一个使用插件系统的 Windows 服务。我在插件基类中使用以下代码为每个 DLL 提供单独的配置(因此它将从 读取plugin.dll.config):

string dllPath = Assembly.GetCallingAssembly().Location;
return ConfigurationManager.OpenExeConfiguration(dllPath);

这些插件需要调用 WCF 服务,所以我遇到的问题是new ChannelFactory<>("endPointName")只在托管应用程序的 App.config 中查找端点配置。

有没有办法简单地告诉 ChannelFactory 查看另一个配置文件或以某种方式注入我的Configuration对象?

我能想到的解决此问题的唯一方法是从读取的值手动创建 EndPoint 和 Binding 对象,plugin.dll.config并将它们传递给其中一个ChannelFactory<>重载。不过,这看起来确实像是在重新创建轮子,并且对于大量使用行为和绑定配置的端点来说,它可能会变得非常混乱。 也许有一种方法可以通过将配置部分传递给 EndPoint 和 Binding 对象来轻松创建它?

4

3 回答 3

4

为每个插件使用单独的 AppDomain。创建 AppDomain 时,您可以指定新的配置文件。

请参阅http://msdn.microsoft.com/en-us/library/system.appdomainsetup.configurationfile.aspx

于 2011-02-18T20:24:00.820 回答
4

有 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:13:00.270 回答
0

这是我找到的第二个问题的解决方案......有人投入工作以读取所有数据ServiceModelSectionGroup并创建一个ChannelFactory.

http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

不过,我将使用 Richard 的解决方案,因为它看起来更干净。

于 2011-02-18T20:41:26.837 回答