消费.net wcf通过反射休息服务
问题描述:
我想通过反射消费一个wcf休息服务,如果可能的话。看看下面的代码:消费.net 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;
}
正如你看到它是一个通用的方法,在运行时需要的...我的问题是,我不知道我是否真能反映信道对象上我正在创建上面....可以说我做了,然后麻烦开始当我想创建一个对象实例...因为我不能创建一个对象实例从一个接口...
我也会很高兴听到有没有其他方法可以做到这一点?但是如果可以的话,我更喜欢使用渠道机制。
答
通常,为每个操作创建ChannelFactory
是昂贵的。如果可能,你应该避免。对于WCF中的ICommunicationObject
类型,using
模式也存在问题,因为Dispose()
通常对应于Close()
,这是一个阻止/异常抛出调用。您需要明确调用Close()
,并处理TimeoutException
和CommunicationException
。
除此之外,您的方法可行。如果您使用ChannelFactory<T>.CreateChannel
,它将创建一个类型为T
的透明代理对象,如果需要,可以通过反射调用该代理对象。所以你不必担心从契约接口创建一个对象 - WCF已经这样做了。
在您的代码示例中,请确保将o
替换为contract
,并且您应该得到预期的结果。
我试过你的方法,但现在我得到错误 System.Reflection.TargetInvocationException:异常已被调用的目标引发。 ---> System.InvalidOperationException:在这个工厂中启用了手动寻址,所以所有发送的消息都必须预先寻址。 – theKing 2009-10-25 02:17:06
我认为您需要将WebHttpBehavior添加到您的工厂: factory.Endpoint.Behaviors.Add(新的WebHttpBehavior()); – bobbymcr 2009-10-25 05:07:25
Yess !!,谢谢作品。谢谢一堆 – theKing 2009-10-25 06:46:14