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