2010-08-05 45 views
1

從asp.net web應用程序調用web服務時,爲避免爲每個webservice調用創建新的代理,我將代理存儲爲dictonary。因此,當對web服務進行調用時,將根據傳遞給工廠方法的密鑰返回web服務代理的實例。如果已經創建了相應密鑰的代理,則返回該代理。否則,它爲密鑰創建一個代理並返回代理。如何在調用不返回任何響應的webservice調用時去除對HttpWebRequests的引用?

這一切工作正常,除非由於某種原因實際的web服務「失敗」,並不會返回任何響應。如果發生這種情況,它在我的情況下會非常頻繁地創建一個System.Net.HttpWebRequest,它不會被GC收集。原因是,HttpWebRequest是HttpWebRequest.GetResponse()中的一個局部變量,它仍在執行中(因爲它正在等待永遠不會到來的響應)。因此,存在對HttpWebRequest的引用將保持對象的活性。

解決此問題的一種方法是將調用放入Using塊中的Web服務,從而在調用完成後處理該對象。這樣,對HttpWebRequest的引用將被切斷,以便HttpWebRequest可以被GC收集。但是,通過部署代理,整個存儲代理的想法是避免爲每個呼叫故障創建一個代理。

因此,我的問題是,有沒有人有任何想法我可以做什麼來解決有沒有從Web服務響應時引用HttpWebRequests的問題?

Thanx提前!

一些僞代碼來解釋存儲在dictonary的代理的概念:

public Proxy GetProxy(String key) { 
      if(!proxies.ContainsKey(key)) { 
       proxies[key] = new Proxy(); 
      } 
      return proxies[key]; 
     } 

public Object GetObject(String key) { 
      Object object = 
      this.GetProxy(key).GetObject(); 
      return object; 
     } 

回答

1

如果目標網站宕機,你可能會得到一個HttpException。你能利用這種機制來管理你的實例的生命週期嗎?

+0

謝謝。這就是我最終做的。 – 2011-03-06 17:11:32

相關問題