2009-09-25 15 views
0

我正在嘗試創建一個單身人士服務,用於處理傳入的請求到HttpHandler。目前該服務正在根據每個請求進行實例化。我做對包含服務的實例的靜態類的調用,如一個單如下實施:在HttpHandler的使用調用如下跨請求到HttpHandler實現單身人士

public static class ServerApplication { 

static Service instance = null; 
static readonly object padlock = new object(); 

/// <summary> 
/// Service singleton. 
/// </summary> 
public static Service Service { 
    get { 
    lock (padlock) { 
     if (instance == null) { 
     instance = new Service(); 
     } 
     return instance; 
    } 
    } 
} 

和訪問:

ServerApplication.Service.Process(request); 

我已經在instance = new Service();行上設置了一個斷點,並且在多個請求中,每個請求觸發 斷點。

我的目標是跨請求存在的服務,因爲它會加載和緩存大量來自文件和數據庫的數據,這些數據可以在大多數請求中重用。

任何人都可以看到出了什麼問題?

+3

這是什麼代碼的目的是什麼?當我一起聽到Singleton和HttpHandler時,我的大腦會拋出一個異常。 – 2009-09-25 01:36:21

+0

基於加載並緩存在服務中的預先設置的文件和數據源呈現圖像的映像服務器。所以該服務處理請求並生成正確的圖像。爲什麼?你是說在應用程序運行時僅僅實例化一次的單個對象是代碼異味? Http只是它被訪問的方法。我可以輕鬆構建桌面應用程序來與服務進行交互。糾正我,如果我錯了。我認爲這很正常。 – theringostarrs 2009-09-25 01:41:49

+0

HttpHandler執行它所說的'處理'Http請求,然後像處理任何其他應用程序一樣處理請求。它可以很容易地在桌面應用程序上點擊按鈕。 – theringostarrs 2009-09-25 01:52:36

回答

1

幾件事情:

  • 如果它是一個多框,從技術上說,你應該用「揮發性」關鍵字標記的共享服務實例或使用內存屏障的調用(見http://blogs.msdn.com/brada/archive/2004/05/12/130935.aspx)。你沒有指定體系結構,所以很難說如果這真的是問題,但比對不起更安全。
  • 您應該實施一個雙重檢查鎖(例如,在獲取「掛鎖」鎖之前和之後檢查null)。通過這種方式,您可以進行更便宜的比較,而不是獲取所有後續讀取的鎖定。

這應該包括你在併發的前沿。也可以(雖然不太可能)你的AppDomain在請求之間被卸載(也就是說,你在web目錄中寫了一個文件,導致ASP.NET認爲你的應用程序已經失效),這會導致靜態重置。

+0

我使用我的服務器文件夾寫入文本和圖像文件,這是否會導致應用程序池重置?當我更改了一個.dll或更新了web.config時,我的印象就是這樣。 – theringostarrs 2009-09-25 03:39:28

+0

這應該是,但我遇到了一些問題,無論如何,它會有一點點跳動和重擊應用程序池。在global.asax中實現Application_End處理程序,如果懷疑發生了什麼,請設置一個斷點。然後你可以詢問HttpContext,詢問爲什麼應用程序正在關閉。 – nitzmahone 2009-09-25 04:13:19

+0

我已經學會了在virdir之外編寫tempfiles等的難題,只是爲了避免這樣的東西。 :) – nitzmahone 2009-09-25 04:14:54

1

HTTP旨在創建多個併發連接,但我不知道您希望打破這種情況,除非在頁面加載時進行非常少的連接。也就是說,也許你可以在會話中保留HttpHandler?

+1

製作一個HttoHandler是一個單身人士,就像試圖讓一輛汽車漂浮在水面上一樣......只是沒有做到這一點。 – 2009-09-25 01:37:49

+1

我沒有使http處理程序成爲單例。 – theringostarrs 2009-09-25 01:43:46