2009-05-25 1 views
61

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

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

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

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

или даже лучше, б) имеют испытанный Устранить

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

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

+1

У меня точно такая же проблема. Единственная причина, по которой я его видел, - это когда я включил обработку исключений в Global.asax. Это очень прерывисто. Было бы здорово, если бы кто-нибудь знал ответ на это! –

+6

Ссылка сейчас не работает :-( – Casebash

+0

Ссылка на ссылку Wayback: https://web.archive.org/web/20090208233145/http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-can not-save-it-because-the-response-was-уже-покраснение-by-the-application/ – lorenzog

ответ

64

У меня есть!

В файле global.asax вы это делаете:

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

Так легко. Оно работает!

+0

Является ли это общедоступным/защищенным методом - поскольку он стоит на частном уровне, я думаю, он должен быть защищен. Является ли образец полным, тот факт, что sessionId не сохраняется, я предполагаю, что это хорошо - его инициирование создания важно, правильно? –

+0

Спасибо. Я думаю, что это вообще работает, поэтому я буду отмечать его как принятый ответ, хотя я не уверен на 100%. Может кто-нибудь прокомментировать, если они найдут случай, когда это не сработает? Благодарю. –

+0

Я просто добавил этот метод к моему файлу global.asax, и он избавился от моего сообщения об ошибке, которое было таким же, как и вопрос, благодаря большому количеству eitama! – vanhornRF

6

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

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

+0

Спасибо , Я посмотрю на это сегодня вечером. Не знаете, почему это было бы прерывистым? –

+0

условный отзыв.Write() в неподходящем случае может быть? –

3

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

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

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

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

18

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

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

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

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

  • Вы не используете Sessio п до вровень

Он поднятый состояния сеанса, когда это пытаются сохранить 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.

По этой причине строка sessionId = Session.SessionID; трюк избежать проблемы.

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

Решения/фокусы:

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

  • Desactivate состояние сеанса на странице (EnableSessionState)

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

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

0

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

<pages buffer="false">  

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^