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

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

Я нашел эту ссылку, которая довольно хорошо резюмирует то, что я смог найти в 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 или попытаться запустить состояние сеанса в жизнь, получив Сессия.SessionID в Session_OnStart.

но разве кто-нибудь:

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

или даже лучше, б) попробуйте и протестируйте fix

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

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

5 ответов


У меня есть!

в мировой.asax файл Вы делаете это:

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

так легко. Работает!


эта ошибка появляется, когда:

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

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

  • ваше приложение заставляет флеш ответа слишком рано

  • вы не используете сеанс до flush

он вызывается состоянием сеанса при попытке сохранить код на выпуск :

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)

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

Это причина, почему string sessionId = сеанс.SessionID; трюк избежать проблемы.

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

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

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

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

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

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


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

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


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

веб.настройка конфигурации DisplayWhenNewSession не имеет значения, поскольку она применяется только к одному определенному customcontrol на Codeplex (извините, я потерял ссылку).

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

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


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

<pages buffer="false">    

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

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