通过反射消费.net wcf休息服务

时间:2009-10-24 21:11:07

标签: c# rest wcf-client

如果可能的话,我试图通过反射来使用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的通用方法......我的麻烦是,我不确定我是否能真正反思我正在创建的通道对象....让我说,然后,当我想创建一个对象实例时,麻烦就开始了......因为我无法从界面创建一个对象实例......

我也很高兴听到有没有其他方法可以实现这一目标?但是如果可以的话,我更喜欢使用渠道机制。

1 个答案:

答案 0 :(得分:2)

通常,为每个操作创建ChannelFactory都很昂贵。你应该尽可能避免这种情况。 using模式对于WCF中的ICommunicationObject类型也存在问题,因为Dispose()通常对应于Close(),这是一个阻塞/异常抛出调用。您需要明确地致电Close()并处理TimeoutExceptionCommunicationException

除此之外,您的方法也可行。如果您使用ChannelFactory<T>.CreateChannel,它将创建一个T类型的透明代理对象,如果您愿意,可以通过反射调用它。因此,您不必担心从合约界面创建对象 - WCF已经这样做了。

在您的代码示例中,请务必将o替换为contract,您应该得到预期的结果。