WCF中的动态通道工厂

3
我正在我的WCF服务中使用以下代码来调用另一个Web服务,该服务可能是WCF服务,也可能不是。
 ChannelFactory<IService1> myChannelFactory = new ChannelFactory<IService1>
                                                  (myBinding, myEndpoint);

所以我想要在一个XML文件中有一些信息,从中读取各种服务端点,并想要将绑定信息传递给通道工厂,并根据配置XML文件中的信息调用其他服务。
因此,我希望每次都使用不同的服务契约信息动态生成通道工厂。
在通道工厂中是否可能,因为各种服务具有不同的接口?
换句话说,从上面的代码中,我有IService1,但是当我从XML文件中读取另一个服务信息时,我想创建具有另一个接口的通道?
1个回答

6
是的,通过泛型是可能的:
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....等等。这可行吗? - Macnique
不,代理是基于服务类型(合同)创建的。因此,在执行其方法之前,您需要为每个服务合同创建一个代理。请注意,在这种情况下,一旦代理被创建,它就可以被重复使用。您可以遵循单例模式并将其存储在工厂类中。 - Arian Motamedi
如果我想创建一个测试代理,并动态地重用同一个代理来处理不同的服务,而不是为每个服务创建一个代理,我该怎么做?可以从XML文件中传递服务契约来实现。 - Macnique
正确。创建代理的优势在于可以控制代理的生命周期,而不是添加服务引用。 - Arian Motamedi
你的解释对我非常有帮助。正在努力提高WCF技能。 - Macnique
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接