【问题标题】:Dynamic Channel Factory in WCFWCF 中的动态通道工厂
【发布时间】:2013-08-20 17:05:44
【问题描述】:

我在我的 WCF 服务中使用以下代码来调用另一个可能是也可能不是 WCF 服务的 Web 服务。

 ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>
                                                  (myBinding, myEndpoint);

所以我想在一个 xml 文件中有一些信息,我从中读取各种服务端点,并希望将绑定信息传递给通道工厂,并根据我在配置 XML 文件中的信息调用其他服务。

所以我想每次都使用不同的服务合同信息动态生成通道工厂。

不同的服务有不同的接口,通道工厂有可能吗?

换句话说,从上面的代码我有 IService1 但是当我从 xml 文件中读取另一个服务信息时,我想用另一个接口创建一个通道?

【问题讨论】:

    标签: c# wcf channelfactory


    【解决方案1】:

    是的,可以通过 Generics:

    public static T CreateProxyChannel<T>()
    {
        string endpointUri = GetServiceEndpoint(typeof(T));
    
        ChannelFactory<T> factory = new ChannelFactory<T>(myBinding, new EndpointAddress(new Uri(endpointUri)));
    
        return factory.CreateChannel();
    }
    

    以及GetServiceEndpoint方法根据T的类型返回端点:

    private static string GetServiceEndpoint(Type service)
    {
        string serviceTypeName = service.Name;
    
        // Code to get and return the endpoint for this service type
    }
    

    请注意,在这种情况下,我希望配置文件具有与服务类型名称关联的端点(例如 IService1http://localhost/Service1.svc)。

    最后使用它:

    IService1 serviceProxy1 = CreateProxyChannel<IService1>();
    serviceProxy1.MyMethod();
    
    IService2 serviceProxy2 = CreateProxyChannel<IService2>();
    serviceProxy2.AnotherMethod();
    

    【讨论】:

    • 我想用一个代理来动态调用多个服务。我不想创建serviceProxy1..serviceProxy2....等等..可以吗??
    • 否,代理是根据服务类型(合同)创建的。因此,您需要为每个服务合同创建一个代理,然后才能对其执行方法。请注意,在这种情况下,一旦创建了代理,就可以重复使用它。您可以遵循 Singleton 模式并将其存储在工厂类中。
    • 如果我想创建一个测试代理并为不同的服务重用相同的代理,动态地从 XML 文件传递​​服务合同,而不是为每个服务创建一个代理?
    • CreateProxyChannel&lt;T&gt;() 是一个泛型方法,可以接受任何类型,但是,一旦调用factory.CreateChannel(); 并创建了代理,就不能更改其类型。这就是为什么,例如,如果您有 4 个服务,您将需要 4 个不同类型的不同代理。这有意义吗?
    • 创建 4 个不同的代理等于添加 4 个服务引用对吗?如果我错了,请纠正我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多