2009-10-24 100 views
1

我想通過反射消費一個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; 
    } 

正如你看到它是一個通用的方法,在運行時需要的...我的問題是,我不知道我是否真能反映信道對象上我正在創建上面....可以說我做了,然後麻煩開始當我想創建一個對象實例...因爲我不能創建一個對象實例從一個接口...

我也會很高興聽到有沒有其他方法可以做到這一點?但是如果可以的話,我更喜歡使用渠道機制。

回答

2

通常,爲每個操作創建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