簡體   English   中英

IIS / .Net僅允許對給定用戶會話的單個並發響應

[英]IIS / .Net only allows single concurrent response to given user session

這是我的問題:

我們有一個.Net 4.5 Web表單應用程序。 由於服務器端的大量數據訪問和操作,應用程序中的某些頁面需要很長時間才能加載。 如果用戶在頁面完成加載之前關閉其瀏覽器選項卡,並打開新選項卡,則新選項卡中對應用程序的任何請求都將掛起20分鍾或更長時間,或者只是超時。 但是,如果他們打開新的隱身窗口(Chrome)或其他瀏覽器,他們可以立即連接。

我相信這是因為.Net按順序處理來自同一會話的並發請求,如下所述: ASP.NET會話狀態概述

並發請求和會話狀態對ASP.NET會話狀態的訪問是每個會話獨占的,這意味着如果兩個不同的用戶發出並發請求,則同時授予對每個單獨會話的訪問權限。 但是,如果對同一會話發出兩個並發請求(通過使用相同的SessionID值),則第一個請求將獲得對會話信息的獨占訪問權。 第二個請求僅在第一個請求完成后執行。 (如果由於第一個請求超過鎖定超時而釋放信息的獨占鎖定,則第二個會話也可以訪問。)如果@ Page指令中的EnableSessionState值設置為ReadOnly,則只讀請求會話信息不會導致會話數據的獨占鎖定。 但是,會話數據的只讀請求可能仍然必須等待由會話數據的讀寫請求設置的鎖定才能清除。

我在研究這個問題時發現的一些帖子暗示(但未確認)當瀏覽器選項卡在響應完成之前關閉時,會話“卡住”並且不會響應來自同一會話的新請求直到該集合SessionTimeout期限已過。 我的假設是,接受來自隱身窗口的請求,因為它有一個新的會話。

除了等待超時之外,有沒有人知道將會話釋放到新請求的任何方法? 有沒有辦法檢測客戶端不再監聽? 我找到了Response.IsClientConnected ,看起來很有希望,但我不確定它會如何使用。

注意:這是一個包含大量業務邏輯的遺留應用程序,當前條件不允許此時重寫的時間或預算。 因此,建議“只是重新編寫頁面以便加載更快”並不是立即可行的,盡管我承認這確實是最好的解決方案。

關於並發性和會話狀態,我自己也遇到過類似的問題。

嘗試在web.config中設置enableSessionState =“ReadOnly”。

在這里看到我的想法: EnableSessionState = ReadOnly - 可能的副作用?

編輯:抱歉,看到您可能已經嘗試過這樣做了。

在web.config中執行enableSessionState =“Readonly”可以提高性能。

要允許會話寫入,您可以覆蓋頁面的此設置,因為,<%@ Page Language =“C#”AutoEventWireup =“true”CodeBehind =“demo.aspx.cs”Inherits =“com.Demo” EnableSessionState =“true” %>

對這些頁面的請求將按順序提供,這是有意義的,因為您正在對會話進行更改,而您不希望並發以避免臟讀。

你有沒有試過這個會話mvc控制器mvc 2 rc

“你有一個客戶端向服務器發出多個並發請求。默認行為是這些請求將被序列化;使用會話較少的控制器,它們並行執行。”

這個鏈接很舊,但也許你可以在MVC3中使用Session less controller找到你的解決方案。

暫無
暫無

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

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