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