【问题标题】:WCF ChannelFactory configuration outside of App.config?App.config 之外的 WCF ChannelFactory 配置?
【发布时间】:2011-06-30 01:49:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# wcf wcf-configuration


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        有 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

        【讨论】:

        • 一开始我很失望,因为 ctor 要求您定义端点已经定义的 EndpointAddress,然后我意识到您可以发送null,它会使用配置的地址。感谢发帖!
        • 是的。我忘了提那个。让我编辑回复并说清楚。
        猜你喜欢
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 2012-10-25
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        相关资源
        最近更新 更多