消费.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(),并处理TimeoutExceptionCommunicationException

除此之外,您的方法可行。如果您使用ChannelFactory<T>.CreateChannel,它将创建一个类型为T的透明代理对象,如果需要,可以通过反射调用该代理对象。所以你不必担心从契约接口创建一个对象 - WCF已经这样做了。

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

+0

我试过你的方法,但现在我得到错误 System.Reflection.TargetInvocationException:异常已被调用的目标引发。 ---> System.InvalidOperationException:在这个工厂中启用了手动寻址,所以所有发送的消息都必须预先寻址。 – theKing 2009-10-25 02:17:06

+0

我认为您需要将WebHttpBehavior添加到您的工厂: factory.Endpoint.Behaviors.Add(新的WebHttpBehavior()); – bobbymcr 2009-10-25 05:07:25

+0

Yess !!,谢谢作品。谢谢一堆 – theKing 2009-10-25 06:46:14