Можно ли форсировать параллелизм запросов при использовании сеансов ASP.NET? - PullRequest
10 голосов
/ 13 сентября 2010

ASP.NET не разрешает одновременные запросы для одного и того же сеанса; Это означает, что пользователь может сделать только 1 запрос за один раз.

Например, скажем, у нас есть Test1.aspx:

  public partial class Test1 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Session["test"] = 1;
      System.Threading.Thread.Sleep(int.Parse(Request.QueryString["timeout"]));
    }
  }

... и Test2.aspx:

  public partial class Test2 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Session["test"] = 1;
      Label1.Text = DateTime.Now.ToString("dd/MM/yy HH:mm:ss");
    }
  }

Когда мы посещаем Test1.aspx?timeout=10000, а затем сразу после посещения Page2.aspx, второй запрос должен будет ждать 10 секунд, пока первый запрос не завершится.

Я только что узнал об этом сегодня и уже 5 лет пользуюсь ASP.NET! Я действительно не верил этому, пока не прочитал его внизу страницы MSDN ( Обзор состояния сеанса ASP.NET ).

Итак, есть ли способ вызвать параллелизм? То есть, кроме ускорения страниц или перемещения длинного кода в фоновый поток. Я знаю, что вы можете сделать сеанс доступным только для чтения, но я не совсем уверен, что это практический вариант.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

Хотя я только что узнал об этом из этого вопроса, я обязательно проверю раздел «Блокировка данных хранилища сеансов» в Реализация поставщика хранилища состояний сеансов , чтобы получить дополнительную информацию о том, почему это сделано.

Исходя из вышеизложенного, попытка обойти этот механизм не очень хорошая идея.

Как вы упомянули, держите запросы короткими и убирайте долго выполняющийся код из потока запросов. Дополнительно:

  • отключите сеанс, если он вам не нужен. Наиболее важно сделать это, если вы отправляете что-то большое в этом запросе.
  • избегайте ненужного использования сеанса.

Все это то, что вы уже должны делать в любом случае.

1 голос
/ 25 августа 2013

Для страниц ASP.NET вы можете попытаться изменить значение EnableSessionState в директиве @ Page ReadOnly.

.NET Framework 4.5 добавил новый HttpContext.SetSessionStateBehavior метод, который можно использовать для установки поведения сеанса для всего приложения

1 голос
/ 13 сентября 2010

Насколько я знаю, это невозможно без создания собственного поставщика состояния сеанса.

(Если вы используете SQL Server в качестве хранилища сеансов, тогда может можно взломать хранимые процедуры, чтобы разрешить одновременное чтение, но определенно не рекомендуется.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...