2011-06-21 53 views
3

我正在開發一個在asp.net中的Web窗體應用程序,並使用jQuery的Ajax調用的大部分操作。對於服務器版本,我使用的是ashx處理程序。asp.net ashx處理程序會話超時和jquery ajax調用

我的問題是當用戶的會話過期(經過一段時間的不活動),並且用戶單擊一個使jQuery ajax調用的按鈕,如何從處理程序中檢測到會話過期並返回特定的json。

a similar qustion但沒有正確的答案。

在此先感謝。

RGDS Rifky

+0

這個問題表明你在問之前沒有環顧四周。這是一個類似的問題,可能有助於[鏈接](http://stackoverflow.com/questions/856553/how-to-get-asp-net-session-value-in-jquery-method) – Ahmad

+0

@ Ahmad-San,我搜索了一個模擬器,但無法找到答案。有一個[類似的問題](http://stackoverflow.com/questions/2006084/managing-session-timeouts-in-asp-net-when-using-asp-net-generichandlers)但沒有正確的答案。任何如何。您提供的鏈接是使用jquery檢查會話值。但我的問題是,如果會話過期並且ajax請求被觸發,我需要檢查處理程序中已過期的會話。 – Rifky

+0

@ Ahmad-San,這表明我在問這個問題之前已經搜索過網絡,所以-1的問題是不公平的 – Rifky

回答

1

一個辦法是檢查是否會話已在您的Global.asax文件的任何ASHX到期。如果有,返回一個json會話過期對象。在客戶端,您將檢查該對象是否存在,並通過javascript將用戶重定向到登錄頁面。

因此,在您Global.asax文件中你會像下面這樣:

protected void Application_AcquireRequestState(object sender, EventArgs e) 
    { 
     var url = HttpContext.Current.Request.Url.OriginalString; 
     var extension = Path.GetExtension(url); 
     if (extension == ".ashx" && HttpContext.Current.Session.Contents.Count == 0) 
     { 
      HttpContext.Current.Response.StatusCode = 440; 
      HttpContext.Current.Response.TrySkipIisCustomErrors = true; 
      HttpContext.Current.Response.Write(new JObject(new JProperty("sessionExpired")).ToString()); 
      HttpContext.Current.Response.End(); 
     } 
    } 

然後,你將創建一個全局AJAX事件錯誤處理程序爲所有的AJAX的查詢,看起來對於「sessionExpired時」對象:

$(document).ajaxError(function (event, xhr, settings) 
{ 
    if (xhr.responseText && $.parseJSON(xhr.responseText).sessionExpired) 
    { 
     window.location.replace("loginUrl.aspx"); 
     return; 
    } 
}); 

這種方法的好處是,你只需要擁有的代碼這兩個片段,以獲得合理的會話到期處置。但是,這種方法存在缺陷:

所有的ashx文件都必須至少具有IReadOnlySessionState或IRequiresSessionState接口。否則,會話過期邏輯將被觸發,因爲會話將被假定爲空。如果你不想要這個,那麼你需要一種方法來排除某些.ashx文件,例如排除包含包含ashx文件的特定路徑的任何url。

此外,如果頁面的某些部分不涉及使用會話,則還需要排除這些頁面。

+0

謝謝你的回答。它可以幫助我 –