Рекомендации по использованию .NET Session для временного хранения? - PullRequest
1 голос
/ 21 июля 2011

Я все еще относительно новичок в .NET и ASP.NET MVC, и у меня было несколько случаев, когда было бы неплохо временно сохранить информацию, извлеченную из БД, чтобы ее можно было использовать при последующем запросе сервера от клиент. Я начал использовать .NET-сессию для хранения этой информации, отключил метку времени и затем извлек эту информацию, используя метку времени, когда я снова нажму на сервер.

Итак, базовый вариант использования:

  1. Пользователь нажимает кнопку «Запрос» для сбора информации из системы.
  2. В JS сгенерируйте временную метку текущего времени и передайте ее на сервер с запросом
  3. На сервере собирать информацию из БД
  4. На сервере используйте уникальную метку времени клиента в качестве ключа в сеансе для хранения объекта ответа.
  5. Возвращать объект ответа клиенту
  6. Пользователь нажимает кнопку «Создать отчет» (форматирует результаты запроса в Excel документ)
  7. Передайте ту же метку времени с # 2 на сервер снова и используйте для сбора результатов запроса с # 4.
  8. Создание отчета без дополнительного обращения к БД.

Это схема, которую я начал использовать в любом случае, когда я использую Сессию как временное хранилище. Но генерация метки времени в JS не обязательно безопасна, и все это кажется немного ... неструктурированным. Есть ли существующий шаблон проектирования, который я могу использовать для этого, или более рациональный / безопасный подход? Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 июля 2011

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

public static string SessionReportKey = "Reports";
public static string ReportIDString = "ReportID";
public Dictionary<string, object> SessionReportData
{
    get
    {
        return Session[SessionReportKey] == null ? 
            new Dictionary<string, object>() : 
            (Dictionary<string, object>) Session[SessionReportKey];
    }
    set
    {
        Session[SessionReportKey] = value;
    }
}
public ActionResult PreviewReport()
{
    //retrive your data
    object reportData = GetData();

    //get identifier
    string myGUID = new GUID().ToString();

    //might only need [SessionReportData.Add(myGUID, reportData);] here
    SessionReportData = SessionReportData.Add(myGUID, reportData);

    //in your view make a hyperlink to PrintReport action with a 
    //query string of [?ReportID=<guidvalue>]
    ViewBag[ReportIDString] = myGUID;

    return View(reportData);
}


public FileContentResult PrintReport()
{
    if(SessionReportData[QueryString[ReportIDString]] == null)
    {
        //error no report in session
        return null;
    }
    return GenerateFileFromData(SessionReportData[QueryString[ReportIDString]]);
}
1 голос
/ 21 июля 2011

Вы можете взглянуть на TempData, в котором хранятся данные в сеансе. Когда вы извлекаете что-то из TempData, оно будет удалено после выполнения действия.

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

Вы также можете вызвать TempData.Peek("key"), который будет хранить его в памяти доВы звоните TempData["key"] или TempData.Remove("key")

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