Подтвердить что ты не робот

Почему SessionID продолжает меняться в ASP.NET MVC?

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

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

HttpContext.Session.SessionID

Я использую код.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Session["myVar"] = "1234";

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

<%=  this.Session.SessionID %>

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

Ответ 4

Я бы посмотрел на использование TempData, чтобы что-то отслеживать.

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

У меня была такая же проблема с использованием ASP.NET Web Forms. Мне просто пришлось добавить файл global.asax в решение, и он исправил его для меня.

Ответ 8

Подводя ответы от @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);
}

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

@HttpContext.Current.Session.SessionID

BobsYourUncle