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