2012-12-23 37 views
0

我有一個大的COM對象,需要從Web服務中調用。所以我實現了一個IHttpAsyncHandler類,希望持有對COM對象的引用。這樣,請求之間的加載時間會減少。我在Windows 2003服務器上運行IIS 6。IHttpAsyncHandler卸載

這樣看來,在HttpHandler的組件(?)因爲我的靜態列表是在後續調用空加工後卸載。即使第二個通話幾乎立即發生,也會發生:

public class x2Handler : IHttpAsyncHandler, System.Web.SessionState.IRequiresSessionState 
{ 
    public bool IsReusable { get { return true; } } 
    private static List<AsynchOperation> _asynch = new List<AsynchOperation>(); 
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
    { 
     AsynchOperation asynch = null; 
     foreach(AsynchOperation op in _asynch){ 
      if (op.Completed){ 
       asynch = op; 
       break; 
      } 
     } 
     if (asynch == null) 
     { 
      asynch = new AsynchOperation(); 
      _asynch.Add(asynch); 
     } 
     asynch.Context = context; 
     asynch.Callback = cb; 
     asynch.State = extraData; 
     asynch.StartAsyncWork(); 
     return asynch; 
    } 

    public void EndProcessRequest(IAsyncResult result) 
    { 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     throw new InvalidOperationException(); 
    } 

} 

每當進程調用_asynch爲空時。應用程序池似乎沒有任何設置會導致程序集卸載。

如何使靜態變量保持通話之間的價值觀?編輯:我不知道它是否有助於解決這個問題,但如果我有一個斷點,它被擊中,然後我刪除斷點,當代碼再次執行(由於另一個HTTP請求)斷點仍然設置。

編輯:我添加了一個析構函數的類,並放置一個斷點,以確定什麼是殺害類,它正在從一個「過渡的AppDomain」叫。

編輯:我已經嘗試從IRequiresSessionState繼承,然後分配一個測試值的上下文.Session和context.Application,都不保留它們之間的調用值。那麼應用程序池是否可以在調用之間釋放?

+0

'名單'不是線程安全的類型。如果你想在多線程環境中使用它,你必須使用適當的鎖定機制來同步對它的訪問。 –

+0

@DarinDimitrov謝謝,將做 –

+0

'IHttpAsyncHandler'用於在長時間運行期間釋放工作線程。我不認爲這是你的問題。你應該更好地描述你對COM對象的問題(並着重於此)。它只是持有一個引用它,所以它不會被卸載? – Codo

回答

0

實際問題是無關的。在調用COM對象之前,我編寫了一個COM對象可以訪問的文本文件。然後我將文本文件的名稱傳遞給COM對象。問題在於我正在將文件寫入安裝HTTPHandler的當前目錄。

Hazarding猜測ASP.Net監視的目錄,並在bin文件夾的任何變化導致當前的處理完成後,該應用程序卸載。因此,應用程序將卸載每個呼叫。移動文本文件解決了這個問題