如何在类型未知时创建动态客户端代理连接?

时间:2009-02-19 17:55:06

标签: c# .net wcf

我知道我可以像以下代码那样在WCF中动态创建客户端端点连接:

BasicHttpBinding basic = 
    new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly); 

basic.Security.Transport.ClientCredentialType = 
    HttpClientCredentialType.Ntlm; 

EndpointAddress serviceAddress = 
    new EndpointAddress("http://whatever/service.svc"); 

YourServiceClient m_client = new YourServiceClient(basic, serviceAddress);

问题是在这种情况下我需要知道'YourServiceClient'是什么。我想要做的是从数据库中获取“YourServiceClient”类型,其中存储为对象。有谁知道我会怎么做这样的事情?我在从DB中检索到的对象中有'YourServiceClient'的值吗?

3 个答案:

答案 0 :(得分:0)

尼古拉斯·艾伦在他的博客中提到了这样的事情(我认为),从part 1开始

IIRC还有一种能够接收原始XML消息的能力,然后您可以自己处理,而不是使用特定类型的代理。

答案 1 :(得分:0)

你无法做到这一点。基本上,您要求在运行时获取未知,但在编译时绑定到已知类型。如果您尝试访问的服务具有某种共享接口,则无法完成此操作。

如果它们具有相同的接口(意味着,同一组方法等等),那么您可以使用此处的示例在运行时创建自己的通道工厂,并获取实现服务接口的代理:

http://msdn.microsoft.com/en-us/library/ms734681.aspx

答案 2 :(得分:0)

如果能够在这里使用泛型(如果没有,那么你可能不得不使用一些反射),那么这就是你所追求的吗?

public TContract GetService<TContract>(EndpointAddress address){
    var channelFactory = new ChannelFactory<TContract>(new NetTcpBinding(),address);
    return channelFactory.CreateChannel();
}