如果可能的话,我试图通过反射来使用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的通用方法......我的麻烦是,我不确定我是否能真正反思我正在创建的通道对象....让我说,然后,当我想创建一个对象实例时,麻烦就开始了......因为我无法从界面创建一个对象实例......
我也很高兴听到有没有其他方法可以实现这一目标?但是如果可以的话,我更喜欢使用渠道机制。
答案 0 :(得分:2)
通常,为每个操作创建ChannelFactory
都很昂贵。你应该尽可能避免这种情况。 using
模式对于WCF中的ICommunicationObject
类型也存在问题,因为Dispose()
通常对应于Close()
,这是一个阻塞/异常抛出调用。您需要明确地致电Close()
并处理TimeoutException
和CommunicationException
。
除此之外,您的方法也可行。如果您使用ChannelFactory<T>.CreateChannel
,它将创建一个T
类型的透明代理对象,如果您愿意,可以通过反射调用它。因此,您不必担心从合约界面创建对象 - WCF已经这样做了。
在您的代码示例中,请务必将o
替换为contract
,您应该得到预期的结果。