Asp .net Сеанс истек, и все данные не были сохранены, понимаете? - PullRequest
0 голосов
/ 13 января 2012

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

Давайте предположим, что тайм-аут сеанса через 30 минут, я началписать много слов, думать и писать время ожидания сеанса и перенаправлять на страницу входа, и все записанные данные теряются.

Любая идея для этой проблемы, кроме продления периода ожидания сеанса ???

Ответы [ 3 ]

0 голосов
/ 13 января 2012

Вы можете использовать некоторую функцию ajax, которая регулярно «звонит домой» (выполняет некоторый фиктивный код на сервере). Это продолжит сеанс, пока этот пользователь откроет эту страницу.

Вам может понадобиться явно использовать Session в этом обратном вызове, например

Session["LastAccess"] = DateTime.Now;

только чтобы сохранить это.

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

0 голосов
/ 13 января 2012

Использовать модель асинхронного программирования, которая позволяет выполнять некоторую часть кода в отдельных потоках.

Существует три стиля программирования с использованием APM

  1. Wait Пока DoneМодель

  2. Модель опроса

  3. Модель обратного вызова

В зависимости от ваших требований и результатов вы можете выбратьмодель, которая является более подходящей.

Например, допустим, вы можете прочитать файл и подождать, пока все будет готово, и пример кода будет

    byte[] buffer = new byte[100];
string filename =
string.Concat(Environment.SystemDirectory, "\\mfc71.pdb");
FileStream strm = new FileStream(filename,
FileMode.Open, FileAccess.Read, FileShare.Read, 1024,
FileOptions.Asynchronous);
// Make the asynchronous call
strm.Read(buffer, 0, buffer.Length);
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// Do some work here while you wait
// Calling EndRead will block until the Async work is complete
int numBytes = strm.EndRead(result);
// Don't forget to close the stream
strm.Close();
Console.WriteLine("Read {0} Bytes", numBytes);
Console.WriteLine(BitConverter.ToString(buffer));

Но создавать ваши потоки не нужно илиПредполагается, что .NET поддерживает встроенный пул потоков, который может использоваться во многих ситуациях, когда вы собираетесь создавать свои собственные потоки.Пример кода

static void WorkWithParameter(object o)
{
string info = (string) o;
for (int x = 0; x < 10; ++x)
{
Console.WriteLine("{0}: {1}", info,
Thread.CurrentThread.ManagedThreadId);
// Slow down thread and let other threads work
Thread.Sleep(10);
}
}

Вместо того, чтобы создавать новый поток и управлять им, мы используем ThreadPool для этой работы, используя его метод QueueWorkItem

WaitCallback workItem = new WaitCallback(WorkWithParameter));
if (!ThreadPool.QueueUserWorkItem(workItem, "ThreadPooled"))
{
Console.WriteLine("Could not queue item");
}
0 голосов
/ 13 января 2012

В настоящее время ваш сеанс создается и управляется в режиме In-Process, и в этом режиме вы не можете восстановить состояние сеанса, как только оно достигнет стадии тайм-аута.Вы можете установить SQL Server Mode и , настроить ваше приложение для SQL Server Mode, чтобы ваши данные были сохранены в базе данных Sql Server.

Свойства профиля - альтернатива для сохраненияштат.

...