Сессия Best Practices - PullRequest
       10

Сессия Best Practices

4 голосов
/ 13 марта 2009

Привет! Я использую сеансы в своем приложении, и мне было интересно, как лучше поддерживать значение сеанса на странице. Мне нужно, чтобы значение, которое хранится в сеансе, было сохранено до тех пор, пока сообщение не вернется на определенную страницу. Позвольте мне проиллюстрировать:

Page A:                             Page B:
Sets Session["ID"] = 5       -->    Gets Session["ID"]
And redirects to Page B             and populates data.

Мне нужно Session["ID"] на странице B, чтобы остаться в живых до тех пор, пока на странице B не будет выполнена обратная запись. Мне это нужно, поскольку я буду использовать значение Session["ID"] update data в базе данных.

Мой вопрос: есть ли какая-либо гарантия, что Session["ID"] сохранит свое значение до тех пор, пока не будет выполнена обратная запись? Разве он не умрет? Если так: Какие методы я могу использовать, чтобы убедиться, что он сохраняет свою ценность?

Я думал о создании закрытой переменной на странице B для хранения Session["ID"] в Page_Load. Пожалуйста, дайте мне знать, что вы думаете, спасибо.

Извините, я должен был сказать: я не могу позволить пользователю изменять ID. Так что нет Query Strings, спасибо.

Ответы [ 6 ]

2 голосов
/ 13 марта 2009

Сессия по умолчанию хранится в памяти на сервере. Это может быть проблематично, если время сеанса пользователя истекло. Также, если вы используете более одного сервера в качестве фермы, вы не можете использовать Session в памяти, поскольку вы не можете гарантировать, что пользователь будет использовать один и тот же сервер каждый раз.

Лучший способ гарантировать, что информация о сеансе не будет потеряна, - это сохранить сеанс пользователя в базе данных SqlServer. Вот руководство по настройке.

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

Также, пожалуйста, смотрите мой ответ на этот вопрос , чтобы найти хороший способ обернуть объект сеанса ASP.NET.

1 голос
/ 13 марта 2009

Поскольку вы используете asp.net и хотите перенести данные с одной страницы на другую, вы также можете использовать обратную передачу CrossPage

пост-кроссбэк с msdn:

При некоторых обстоятельствах вы можете хочу разместить одну страницу на другой. Например, вы можете создать многостраничная форма, которая собирает Разная информация на каждой странице. В В этом случае вы можете настроить определенные контроли (те, которые реализуют Интерфейс IButtonControl, такой как Кнопка управления) на странице для публикации другая целевая страница. Это упоминается как постраничное размещение. Размещение на нескольких страницах обеспечивает некоторые преимущества перед использованием трансфера метод для перенаправления на другую страницу. Для получения дополнительной информации см. Перенаправление пользователей на Другая страница.

if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

источник: http://msdn.microsoft.com/en-us/library/ms178139.aspx

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

0 голосов
/ 11 марта 2015

Если у нас есть страница, для которой не требуется время ожидания сеанса, то согласно

источник: https://msdn.microsoft.com/en-us/magazine/cc163730.aspx,

мы можем использовать <% @ Page EnableSessionState = "False"%>

также ссылка обсуждает различные лучшие практики.

0 голосов
/ 13 марта 2009

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

Реальная вещь, которая меня интересует, - почему бы вам просто не передать его в качестве параметра GET при перенаправлении со страницы А на страницу Б? У вас может быть совершенно веская причина, но обычно, если бы я хотел передать данные с одной страницы на другую, я бы так и сделал.

0 голосов
/ 13 марта 2009

Переменные сеанса остаются активными до истечения времени ожидания сеанса (период времени, указанный в файле web.config)

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

В asp.net вы можете использовать viewstate для сохранения данных в постбэках на одной странице.

Для вашего вопроса я бы рекомендовал использовать параметры строки запроса URL для передачи идентификатора между страницами

т.е. myurl.aspx? ID = 5

затем в вашем коде aspx выполните:

int ID = (int)page.request.params["ID"];

Edit:

Если вы обеспокоены тем, как пользователи изменяют параметр ID, вы можете поместить бизнес-логику в загрузку страницы на странице B, чтобы убедиться, что у пользователя есть необходимые права для изменения этого значения ID.

0 голосов
/ 13 марта 2009

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

РЕДАКТИРОВАТЬ: Если вы не хотите, чтобы пользователь изменял значение, вы можете зашифровать / скрыть поле скрытой записи.

...