簡體   English   中英

ASP.Net MVC:使用Windows身份驗證處理應用程序的會話

[英]ASP.Net MVC : Handle session for application using windows authetication

我已經在Windows身份驗證的ASP.NET MVC中開發了一個應用程序。 我正在使用會話,臨時數據這種技術來將數據持久保存在不同的請求中。 但是這里的問題是,當用戶在會話中使系統空閑超過20分鍾時,由於會話超時,臨時數據不再可用。

為了解決這個問題,我計划使用以下代碼。 我將每20分鍾發出一個ajax請求以保持會話。 因此,即使用戶空閑,系統也不會超時,並且用戶可以從他之前離開的地方開始。

 setInterval(function () {
            $.ajax({
                url: url,
                datatype: 'json',
                async: true,
                cache: false,
                success: function () {
                       // alert("2 min");
                }
            });

        }, 1200000);

我想知道他們是否有使用這種方法的利弊。 還是在這種情況下可以使用其他替代方法?

根據msdn

超時屬性不能設置為大於525,600分鍾(1年)的值。 默認值為20分鍾。

會話超時的增加將阻止服務器釋放分配給非活動會話的內存。

缺點:如果您有大量用戶,並且會話超時增加,則您將遇到性能問題,您的非活動會話將保留在Web服務器內存中,這可能導致應用程序池回收,從而導致所有用戶的所有會話丟失。

該值取決於您對應用程序的批評程度,但您的Web應用程序應始終具有斷開連接超時,因為...大多數用戶無法正確斷開連接...

如果您調用的頁面不執行任何操作,則對於中等數量的用戶(貝洛1000同時連接),您的服務器不會有任何問題。

您可以選擇ajax調用,但更干凈的方案是增加會話超時值。 即使在非關鍵應用程序上,我也不會建議它持續2個小時以上。 在您的web.config中:

<sessionState mode="StateServer" cookieless="false" timeout="120"/>

我會以不同的方式去。 我會將您的會話臨時數據存儲在SQL \\ other存儲中,並將其映射到ASP.Net SessionID。 當用戶在站點上登錄時,我將基於SessionID將其臨時數據存儲在SQL上。 我也將訂閱Session_End事件(僅在InProc模式下有效),並且當會話超時(20分鍾)時,我將基於會話更新DB中的數據。

然后在幾個小時的超時后,當用戶返回相同的瀏覽器會話時-他的SessionID將相同,然后如果會話為空,我會將數據從DB還原到該新會話,因此用戶將看不到任何內容。區別。 如果他關閉瀏覽器並再次啟動,則會話ID無論如何都是新的,並且將與您當前的方法相同。

我也有一些任務,將清理數據庫中的舊會話數據以免浪費數據庫。

因此,采用這種方法,您的Web服務器不會在AppPool進程內存中存儲數小時的無用會話數據,也不會像原始問題中那樣獲得大量的保持活動請求。

更新:另一點是,默認情況下,IIS每隔24小時或20分鍾不活動后都會回收AppPool,因此在保持活動狀態下-會話將在Web應用程序啟動24小時后終止,並且保持活動請求將無法保存它。 在我的方法中,這無關緊要,因為我們將臨時會話數據存儲在數據庫存儲中,並且可以很好地重新加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM