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

Не уверен, насколько это будет полезно для вас, но кто-то проделал довольно большую работу по уменьшению размера простого Windows .exe .

Они смогли создать простой .exe-файл, который будет выполняться в современной версии Windows размером 133 байта, используя некоторые очень экстремальные методы.

74
задан Mr Lister 1 May 2012 в 16:11
поделиться

4 ответа

Я!

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

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

Так просто. Это работает!

80
ответ дан 24 November 2019 в 12:02
поделиться

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

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

6
ответ дан 24 November 2019 в 12:02
поделиться

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

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

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

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

3
ответ дан 24 November 2019 в 12:02
поделиться

Эта ошибка появляется в следующих случаях:

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

  • Вы используете Global.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)

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

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

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

Решения / приемы :

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

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

  • Используйте трюк SessionID перед сбросом

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

21
ответ дан 24 November 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: