2011-12-04 108 views
1

我有以下問題:重新發布ASP.NET Web應用程序導致(如預期的)會話重置在哪裏我保留其他用戶信息(訪問嘗試會導致NullReferenceException)。FormsAuthentication.RedirectToLoginPage()什麼都不做

爲了避免這種情況,我的網頁檢查這個信息存在,並在空的情況下,重定向用戶到登錄頁面(窗體身份驗證),所以我打電話:

void LogOut() 
{ 
    Session.Clear(); 
    Session.Abandon(); 
    User = null; 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.RedirectToLoginPage() 
} 

但有時它並不能幫助,所以我找到了一個解決辦法:

Response.Redirect(FormsAuthentication.LoginUrl); 

,但它不添加RETURNURL,我希望它是(我不想手動模擬這種行爲)。

所以想弄清楚爲什麼第一種方式不能按預期工作。

回答

5

您是否在FormsAuthentication.RedirectToLoginPage()之後嘗試致電Response.End()

1

我有以下問題:重新發布ASP.NET Web應用程序導致(如預期的)會話重置我在哪裏保留其他用戶信息(訪問嘗試會導致NullReferenceException)。

但有時它並不能幫助

我不知道你所說的「有時候它並不能幫助」的意思 - 你不說,到底發生了什麼。

但是您應該記住,Forms Authentication工單的到期和Session超時到期是完全獨立的。用戶的會話可能會在他的Forms身份驗證票證仍然有效時超時,反之亦然。

一般來說,從會話中訪問數據時,你應該總是測試存在第一,並在必要時進行刷新:

object o = Session["Whatever"]; 
if (o == null) 
{ 
    o = ... refresh it e.g. from the database 
    Session["Whatever"] = o; 
} 
... 

通常,它使用一個輔助類來封裝這是非常有用的。

在你的情況下,你指的是「額外的用戶信息」 - 所以你可能會使用HttpContext.Current.User.Identity.Name作爲關鍵字來檢索。

強制用戶再次登錄,因爲會話已過期,例如,由於服務器上的應用程序池回收,非常不友好。

UPDATE

MSDN文檔RedirectToLoginPage指出:

不同於HttpResponse.Redirect方法,此方法不通過調用HttpResponse.End結束請求。這意味着在RedirectToLoginPage方法調用之後的代碼將運行。

這也許就是你所看到的:在頁面生命週期代碼的調用RedirectToLoginPage運行後,並拋出一個NullReferenceException

您可以在RedirectToLoginPage之後撥打Response.End來避免這種情況。

My Session timeout set = Forms auth timeout(via web.config)。

我會重新迭代會話失效和FormsAuthentication失效是不相關的,即使超時碰巧是相同的。 FormsAuthentication cookie將在服務器上的應用程序池回收中倖存下來;會議不會。

+0

謝謝你的迴應。發生了什麼(什麼不是):'RedirectToLoginPage()'什麼都不做 - 代碼執行前面,我得到NullReferenceException因爲保持會話有關當前用戶的更多信息(一些鏈接對象,例如ClientCompanyName) – abatishchev

+0

My Session timeout set = Forms auth超時(通過web.config)。用戶將被自動重定向到通過表單auth登錄頁面,按預期工作。但我的場景是更多的開發/部署過程相關的:在發佈新版本之後,我想將其重定向到登錄頁面,並且不會得到NullReferenceException。 – abatishchev