Пессимистическое предположение о времени жизни объекта сеанса ASP.NET!

Я проверяю session объект и, если он существует, вызвать другой метод, который будет использовать этот объект косвенно. Хотя второй метод должен был получить доступ к этому объекту через несколько наносекунд, я думал о ситуации, когда объект точно истекает между двумя вызовами. Есть ли Session объект продлевает свое время жизни при каждом доступе к чтению из кода для предотвращения такой проблемы? Если нет, как решить проблему?

Если вы собираетесь сказать, почему я не передаю извлеченный объект из первого метода во второй, это потому, что я передаю ASP.NET Page объект, который несет много других параметров внутри него во второй метод, и если я попытаюсь передать каждый из них отдельно, было бы много параметров, в то время как я просто передаю один Page возражать сейчас.

3 ответа

Решение

Не волнуйся, этого не произойдет

Если я понимаю вашу ситуацию, она работает примерно так:

  1. Доступ к определенной странице
  2. Если сеанс активен, он немедленно перенаправляет на вторую страницу или выполняет определенный метод на первой странице.
  3. Вторая страница / метод использует сессию

Вы боитесь, что сессия истечет между выполнением первого и второго метода / страницы.

По сути, это невозможно, поскольку таймер сеанса был сброшен перед началом обработки первой страницы. Таким образом, если на первой странице был активный сеанс, то и на второй странице / методе он также будет (если обработка заканчивается до 20 минут - время ожидания сеанса по умолчанию).

Как обрабатывается сессия

Сеанс обрабатывается с помощью модуля HTTP, который запускается при каждом запросе и до начала обработки страницы. Это объясняет поведение. Если вы не знакомы с модулями HTTP, то советую немного прочитать об интерфейсе IHttpModule.

Мне трудно понять, в чем здесь проблема, но позвольте мне попробовать еще раз, ссылаясь на безопасность потоков.

Проблема безопасности потока

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

if (obj == null)
{
    lock (objLock)
    {
        if (obj == null)
        {
            obj = GenerateYourObject();
        }
    }
}

Проверьте документацию по блокировке на MSDN, если вы никогда не использовали ее раньше. И не забудьте также проверить другие веб-ресурсы.

Это довольно сложно понять твой вопрос, ИМХО, но я постараюсь.

Из того, что я понимаю, вы делаете что-то вроде:

string helloWorld = string.Empty;
if (this.Session["myObject"] == null)
{
    // The object was removed from the session or the session expired.
    helloWorld = this.CreateNewMyObject();
}
else
{
    // Session still exists.
    helloWorld = this.Session["myObject"].ToString(); // <- What if the session expired just now?
}

или же

// What if the session existed here...
if (this.Session["myObject"] == null)
{
    this.Session["myObject"] = this.CreateNewMyObject();
}

// ... but expired just there?
string helloWorld = this.Session["myObject"].ToString();

я думал так Session Объект управляется тем же потоком, что и запрос страницы, что будет означать, что можно проверить, существует ли объект, чем использовать его без try/catch.

Я был неправ

Для объектов Cache вы должны осознавать тот факт, что вы имеете дело с объектом, к которому обращаются из нескольких потоков.

Источник: ASP.NET Cache и хранилище состояния сеанса

Я также ошибался, если не внимательно прочитал ответ Роберта Коритника, который на самом деле четко отвечает на вопрос.

На самом деле вас предупреждают о том, что объект может быть удален во время запроса страницы. Но с тех пор Session Время жизни зависит от запросов страниц, это будет означать, что вы должны учитывать удаление переменных сеанса, только если ваш запрос занимает больше времени, чем время ожидания сеанса (см. Как обрабатывается сеанс в ответе Роберта Коритника).

Конечно, такая ситуация очень редкая. Но если в вашем случае вы уверены, что запрос страницы может занять более 20 минут (время ожидания сеанса по умолчанию), чем да, вы должны принять во внимание, что объект может быть удален после того, как вы проверили, существует ли он, но прежде чем вы действительно используете это.

В этой ситуации вы, очевидно, можете увеличить время ожидания сеанса или использовать try / catch при доступе к объектам сеанса. Но ИМХО, если запрос страницы занимает десятки минут, вы должны рассмотреть другие варианты, такие как службы Windows, для выполнения работы.

Другие вопросы по тегам