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


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

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

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

а) есть объяснение этому

или даже лучше, б) есть проверенные исправления

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

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

5 64

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 события или нет

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

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

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

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)

Я считаю наличие глобального.эйсакс причин идентификатор сессии должен быть сохранен на освобождение объекта sessionstatemodule (поздно?) даже если ни один сеанс не был использован вместо HttpSessionState при вызове SessionID.

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

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

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

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

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

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

  • Использовать Ответ.Конец () вместо .Метод flush (), если вы не заботитесь об ошибках, которые могут возникнуть после промывки

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

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

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

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

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

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

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

<pages buffer="false">    

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

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