Что заставляет "состояние сеанса создать идентификатор сеанса, но не может его сохранить, потому что ответ уже был сброшен приложением".

Я получаю эту ошибку с перерывами.

Я нашел эту ссылку, которая довольно хорошо излагает то, что я смог найти в Google: http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-cannot-save-it-because-the-response-was-already-flushed-by-the-application/

В основном это говорит о том, что вы можете попробовать установить настройку веб-конфигурации DisplayWhenNewSession или попробовать начать работу с состоянием состояния сеанса, получив Session.SessionID в Session_OnStart.

Но кто-нибудь:

a) имеют объяснение для этого

или даже лучше, b) иметь проверенное и исправленное исправление

Я понимаю, что я не могу очистить ответ после выполнения всего, что повлияет на заголовок ответа HTTP. Если бы я это сделал, это вызывало бы ошибку каждый раз, но это прерывисто. SessionID должен быть обязательно создан ASP.NET в начале ответа на страницу автоматически, прежде чем что-либо на странице ASPX или в Page_Load (где все мои флеши вызываются).

Update: При отражении я понимаю, что это происходит при потоковой передаче файла в браузер. Большинство браузеров - это боты поисковых систем. Я могу воссоздать эту ошибку, начав загрузку и затем закрыть браузер, поэтому, предположительно, браузеры не дождались завершения загрузки до отмены операции загрузки. Я также видел это на других нормальных страницах, но в 99% случаев он загружает страницы.

Ответ 1

У меня есть!

В файле global.asax вы выполните следующее:

void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    string sessionId = Session.SessionID;
}

Так просто. Он работает!

Ответ 2

Эта ошибка появляется, если:

  • Запуск приложения

  • Вы используете Global.asax, даже если вы делаете что-то в событиях Session_Start/End или не

  • Ваше приложение заставляет Flush ответа слишком быстро

  • Вы не используете сеанс перед флешем

Он возникает из состояния сеанса, когда он пытается сохранить sessionID при выпуске:

System.Web.SessionState.SessionIDManager.SaveSessionID(HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded)
System.Web.SessionState.SessionStateModule.CreateSessionId()
System.Web.SessionState.SessionStateModule.DelayedGetSessionId()
System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID()
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs)
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Я полагаю, что наличие Global.asax заставляет идентификатор сеанса быть сохраненным при выпуске SessionStateModule (поздно?), даже если для HttpSessionState при вызове SessionID не использовался сеанс.

Это причина, по которой string sessionId = Session.SessionID; позволяет избежать проблемы.

Я предполагаю, что он появляется только при запуске приложения из-за поведения инициализации.

Решения/трюки:

  • Избегайте промывки в Page_Load, как уже говорилось

  • Дезактивировать состояние сеанса на странице (EnableSessionState)

  • Используйте трюк SessionID перед флешем

  • Используйте Response.End() вместо .Flush(), если вас не волнуют ошибки, которые могут возникнуть после вашего флеша

Ответ 3

Я считаю, что проблема здесь может быть именно в том, что вы делаете что-то, чтобы вызвать вывод страницы во время Page_Load, который, согласно странице ASP.NET Обзор жизненного цикла задолго до этапа рендеринга.

Убедитесь, что вы никогда не делаете ничего, что могло бы вызвать вывод страницы до тех пор, пока после этапа PreRender.

Ответ 4

Просто столкнувшись с этой проблемой, я решил поделиться своими выводами.

Настройка web.config DisplayWhenNewSession не имеет значения, поскольку она применима только к одному конкретному настраиваемому контроллеру на Codeplex (извините, что я потерял ссылку).

Другое предложение, похоже, работает, сначала инициализируя SessionId. Я вникнул в код с помощью Reflector и не мог понять, как это предотвратило ошибку здесь, но это, безусловно, сработало для нас!

Как и большинство людей, которые, похоже, сталкиваются с этой ошибкой, мы явно не вызываем Response.Flush() в любом месте приложения. Мы также используем MVC для записи.

Ответ 5

Я признаю, что это очень старый, но я нашел другую причину ошибки, которая может быть применима к другим. Если вы используете MVC (я использовал MVC 4 с .Net 4.0), и вы устанавливаете страницы, чтобы не буферизировать с помощью элемента web.config

<pages buffer="false">    

Затем, если в вашем коде вы пытаетесь вставить данные в объект сеанса, может возникнуть риск получить эту ошибку, если страница начала рендеринг перед просмотром вашего ребенка или действием, выполняющим доступ к сеансу.

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