1

如果可能的话,我正在尝试通过反射来使用 wcf 休息服务。看看下面的代码:

    public static object WCFRestClient<T>(string method, string uri, params object[] args)
    {        
        object o;
        object ret;
        using (ChannelFactory<T> cf = new ChannelFactory<T>(new WebHttpBinding(), uri))
        {                
            T contract = cf.CreateChannel();
            ret = contract.GetType().GetMethod(method).Invoke(o, args);

        }
        return ret;
    }

如您所见,这是一个在运行时需要 T 的通用方法...我的麻烦是,我不确定我是否真的可以反映我在上面创建的通道对象...。假设我可以,那么麻烦当我想创建一个对象实例时开始......因为我无法从接口创建一个对象实例......

我也很高兴听到是否有其他方法可以做到这一点?但如果可以的话,我更喜欢使用通道机制。

4

1 回答 1

2

一般来说,ChannelFactory为每个操作创建一个是昂贵的。如果可能的话,你应该避免这种情况。该模式对于WCFusing中的类型也是有问题的,因为通常对应于哪个是阻塞/异常抛出调用。您将需要显式调用并处理and 。ICommunicationObjectDispose()Close()Close()TimeoutExceptionCommunicationException

除此之外,你的方法会奏效。如果您使用ChannelFactory<T>.CreateChannel,它将创建一个透明的代理对象类型T,如果您愿意,可以通过反射调用该对象。因此,您不必担心从合同接口创建对象——WCF 已经这样做了。

在您的代码示例中,确保将 替换为ocontract您应该会得到预期的结果。

于 2009-10-24T21:46:39.110 回答