Пессимистическое предположение о времени жизни объекта сеанса ASP.NET! - PullRequest
0 голосов
/ 29 ноября 2010

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

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

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

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

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

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

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

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

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

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

0 голосов
/ 29 ноября 2010

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

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

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

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

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

0 голосов
/ 29 ноября 2010

Довольно сложно понять твой вопрос, ИМХО, но я попробую.

Насколько я понимаю, вы делаете что-то вроде:

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 и состояние сеанса

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

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

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

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

...