2008-10-05 25 views
0

在我的使用InProc會話的ASP.NET應用程序中,Session_End調用另一個對象中的靜態方法來執行特定於會話的清理。這種清理使用了我在應用程序狀態下存儲的共享數據庫連接。在Session_End期間訪問HttpApplicationState

問題是,我看不到如何訪問應用程序狀態而不傳遞它(或者數據庫連接)作爲清理方法的參數。由於我不在請求中,因此我沒有當前的HttpContext,並且找不到任何其他靜態方法來訪問狀態。

我錯過了什麼嗎?

UPDATE:看來我的問題需要進一步澄清,所以讓我試試下面的代碼示例。我希望能夠做的是:

// in Global.asax 
void Session_End(object sender, EventArgs e) 
{ 
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup; 
    nc.CleanUp(); 
} 

但問題是,反過來CleanUp方法需要存儲在應用程序狀態信息。我已經在做下面的事情,但這正是我希望避免的;這就是我所說的「......沒有通過......作爲清理方法的一個參數」。

// in Global.asax 
void Session_End(object sender, EventArgs e) 
{ 
    NeedsCleanup nc = Session["NeedsCleanup"] as NeedsCleanup; 
    nc.CleanUp(this.Application); 
} 

我只是不喜歡Global.asax知道在哪裏NeedsCleanup對象獲取信息的想法。這種事情在課堂上更具自我感。

回答

0

?如果它在Session_Start中,那麼您的全局類將知道如何/何時創建和銷燬這些實例是有道理的。

我知道你想將NeedsCleanup的清理與其調用者分離。也許更簡潔的方法是通過「this」引用傳遞在「HttpContext.Current.ApplicationInstance」和Global類中找到的「HttpApplication」實例。另外,你也可以指定上面提到的任何一個構建實例,這樣可以使得清理更少耦合。

1

您應該可以使用Session_End中的Session屬性來訪問SessionState對象。

void Session_End(object sender, EventArgs e) 
{ 
    HttpSessionState session = this.Session; 
} 

此屬性和更大量來自於基類的Global.asax

+0

會話屬性是我得到我的對象,清理。它是需要訪問_application_狀態的被調用對象。而這正是麻煩所在。 – DocMax 2008-10-05 05:37:27

3

的你應該能夠從內部Session_End中使用Application屬性ApplicationState對象。

void Session_End(object sender, EventArgs e) 
{ 
    HttpApplicationState state = this.Application; 
} 

(有,因爲我沒有信譽需要直接評論在不同的答案回答)你在哪裏創造了「NeedsCleanup」實例

+0

這應該可以正確得到應用程序對象 – Tom 2008-10-06 17:50:51

+0

@Greg,你可以編輯你的原始答案。無論如何,現在你有很多代表,你應該清理這些蠢事。 – KyleMit 2016-09-02 13:46:20