Ответ 1
У меня есть!
В файле global.asax вы выполните следующее:
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
string sessionId = Session.SessionID;
}
Так просто. Он работает!
Я получаю эту ошибку с перерывами.
Я нашел эту ссылку, которая довольно хорошо излагает то, что я смог найти в 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% случаев он загружает страницы.
У меня есть!
В файле global.asax вы выполните следующее:
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
string sessionId = Session.SessionID;
}
Так просто. Он работает!
Эта ошибка появляется, если:
Запуск приложения
Вы используете 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(), если вас не волнуют ошибки, которые могут возникнуть после вашего флеша
Я считаю, что проблема здесь может быть именно в том, что вы делаете что-то, чтобы вызвать вывод страницы во время Page_Load
, который, согласно странице ASP.NET Обзор жизненного цикла задолго до этапа рендеринга.
Убедитесь, что вы никогда не делаете ничего, что могло бы вызвать вывод страницы до тех пор, пока после этапа PreRender
.
Просто столкнувшись с этой проблемой, я решил поделиться своими выводами.
Настройка web.config DisplayWhenNewSession не имеет значения, поскольку она применима только к одному конкретному настраиваемому контроллеру на Codeplex (извините, что я потерял ссылку).
Другое предложение, похоже, работает, сначала инициализируя SessionId. Я вникнул в код с помощью Reflector и не мог понять, как это предотвратило ошибку здесь, но это, безусловно, сработало для нас!
Как и большинство людей, которые, похоже, сталкиваются с этой ошибкой, мы явно не вызываем Response.Flush() в любом месте приложения. Мы также используем MVC для записи.
Я признаю, что это очень старый, но я нашел другую причину ошибки, которая может быть применима к другим. Если вы используете MVC (я использовал MVC 4 с .Net 4.0), и вы устанавливаете страницы, чтобы не буферизировать с помощью элемента web.config
<pages buffer="false">
Затем, если в вашем коде вы пытаетесь вставить данные в объект сеанса, может возникнуть риск получить эту ошибку, если страница начала рендеринг перед просмотром вашего ребенка или действием, выполняющим доступ к сеансу.
В таких случаях вы можете исправить ошибку, изменив настройку буфера выше на true. Кроме того, переместите код доступа к сеансу в основное представление, а не в дочернее представление/дочернее представление.