SessionID постоянно меняется в ASP.NET MVC, почему? - PullRequest
44 голосов
/ 11 ноября 2008

Я пытаюсь отследить что-то и использую SessionID, поскольку они указывают на этот объект

Однако SessionID каждые 2-3 запроса изменений не должен оставаться прежним?

HttpContext.Session.SessionID

Код, который я использую.

Ответы [ 8 ]

48 голосов
/ 12 ноября 2008

Я видел это даже без MVC. Если я правильно помню, ASP.NET продолжает присваивать новые идентификаторы сеансов, пока вы не поместите что-либо в переменную Session.

25 голосов
/ 29 апреля 2011

Вы должны инициализировать объект Session в Global.asax.cs.

void Session_Start(object sender, EventArgs e)
{
    HttpContext.Current.Session.Add("__MyAppSession", string.Empty);
}

Таким образом, сессия не изменится, если окно браузера не закрыто.

5 голосов
/ 19 января 2009

Я работаю над приложением корзины .NET MVC, и я добавил

Session["myVar"] = "1234";

к методу Page_Load, найденному в коде Default.aspx.cs. Я также добавил

<%=  this.Session.SessionID %>

в Site.Master нижний колонтитул. Затем я перестроил свое приложение и просмотрел различные страницы своего приложения, и нижний колонтитул отображает одинаковый идентификатор сессии для всех страниц, как и ожидалось!

3 голосов
/ 29 октября 2010

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

Таким образом, когда страница переворачивается, отсутствует файл cookie текущего идентификатора сеанса, поэтому создается новый идентификатор сеанса, следовательно, он случайный.

Это логично, зачем связывать приложение с сеансом, если сеанс не используется?

2 голосов
/ 11 ноября 2008

Я бы хотел использовать TempData для отслеживания чего-либо.

0 голосов
/ 23 марта 2016

Подведение итогов ответов @jrojo и @Maxam выше, с тем, что я использую.

Я использую AWS DynamoDB в качестве хранилища сессий (немного выходит за рамки вопроса, но дает пример).

Добавить пакет через NUGET: Install-Package AWS.SessionProvider

Обновите Web.config, чтобы иметь ключи в appSettings:

<add key="AWSAccessKey" value="XXX" />
<add key="AWSSecretKey" value="YYY" />

И поставщик сеанса для system.web:

<sessionState timeout="20"
              mode="Custom"
              customProvider="DynamoDBSessionStoreProvider">
  <providers>
    <add name="DynamoDBSessionStoreProvider"
      type="Amazon.SessionProvider.DynamoDBSessionStateStore, AWS.SessionProvider"
      AWSProfilesLocation=".aws/credentials"
      Table="ASP.NET_SessionState"
      Region="us-east-1"
      />
  </providers>
</sessionState>

Добавить что-либо в сеанс в global.asax при запуске сеанса:

void Session_Start(object sender, EventArgs e) {
  HttpContext.Current.Session.Add("somethingToForceSessionIdToStick", string.Empty);
}

Проверьте, добавив это к бритве любой страницы. Обновите эту страницу, затем откройте окно ignito и просмотрите другой сеанс:

@HttpContext.Current.Session.SessionID

BobsYourUncle

0 голосов
/ 21 января 2014

У меня возникла та же проблема с использованием веб-форм ASP.NET. Мне просто нужно было добавить global.asax файл к решению и исправить это для меня.

0 голосов
/ 12 ноября 2008

Попробуйте добавить машинный ключ в ваш web.config:
Генератор ключей онлайн: http://aspnetresources.com/tools/keycreator.aspx Кажется, что сервер сбрасывает машинный ключ для клиента и генерирует новый с новым идентификатором сеанса каждые несколько минут, что намного ниже, чем следовало бы. Не знаю, это ошибка или особенность:)
Кроме того, вы можете увеличить время ожидания вашего сеанса, которое, я думаю, составляет 20 минут по умолчанию.

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