asp.net - net - sessionstate mode inproc
Lo que está causando "El estado de la sesión ha creado una identificación de la sesión, pero no puede guardarla porque la aplicación ya ha borrado la respuesta". (5)
¡Yo tengo!
En el archivo global.asax, haz esto:
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
string sessionId = Session.SessionID;
}
Tan fácil. ¡Funciona!
Estoy recibiendo esta falla intermitentemente.
Encontré este enlace que resume bastante bien lo que pude encontrar en Google: http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but- no se puede-save-it-because-the-response-was-already-flushed-by-the-application /
Básicamente dice que puedes intentar establecer la configuración de configuración web DisplayWhenNewSession, o intentar darle vida al estado de la sesión obteniendo Session.SessionID en Session_OnStart.
Pero, ¿alguien?
a) tener una explicación para esto
o mejor aún, b) tener una solución probada
Me doy cuenta de que no puedo eliminar la respuesta después de hacer algo que afecte el encabezado de respuesta http. Si lo hiciera, provocaría un error cada vez, pero esto es intermitente. El SessionID seguramente debe ser creado por ASP.NET al comienzo de la respuesta de la página automáticamente, antes que nada en la página ASPX o en Page_Load (que es donde se llaman todos mis colores).
Actualización: reflexionando me doy cuenta de que esto está sucediendo al transmitir un archivo al navegador. La mayoría de los navegadores son en realidad bots de motores de búsqueda. Puedo recrear este error iniciando una descarga y luego cerrando el navegador, por lo que presumiblemente los navegadores no esperan que la descarga se complete antes de cancelar la operación de descarga. También he visto esto en otras páginas normales, pero el 99% del tiempo son páginas de descarga.
Creo que el problema aquí puede ser exactamente que está haciendo algo para causar una salida de página durante Page_Load
, que, de acuerdo con ASP.NET Page Lifecycle Overview, es mucho antes de la etapa de renderizado.
Asegúrese de que nunca haga nada que pueda desencadenar la salida de la página hasta después de la etapa PreRender
.
Este error parece aparecer cuando:
El inicio de la aplicación
Está utilizando un archivo.asax global incluso si está haciendo algo en los eventos Session_Start / End o no
Tu aplicación fuerza el color de la respuesta demasiado pronto
No estás usando la Sesión antes del enrojecimiento
Lo plantea el estado de la sesión cuando intenta guardar el ID de sesión en la versión:
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)
Creo que la presencia de Global.asax hace que el SessionStateModule guarde el ID de sesión en el lanzamiento (¿tarde?) Incluso si no se ha utilizado ninguna sesión en lugar de HttpSessionState cuando se llama a SessionID.
Es la razón por la cual string sessionId = Session.SessionID; truco evitar el problema
Supongo que solo aparece en el inicio de la aplicación debido a los comportamientos de inicialización.
Soluciones / trucos :
Evite descargar en Page_Load como ya se dijo
Desactivar el estado de la sesión en la página (EnableSessionState)
Usa el truco de SessionID antes del color
Use Response.End () en lugar de .Flush () si no le importan los errores que pueden ocurrir después de su descarga
Habiendo encontrado este problema yo mismo, pensé en compartir mis hallazgos.
La configuración de web.config DisplayWhenNewSession es irrelevante, ya que solo se aplica a un control personalizado en particular en Codeplex (lo siento, perdí el enlace).
La otra sugerencia parece funcionar al inicializar SessionId temprano. Busqué en el código usando Reflector y no pude ver cómo esto evitó el error aquí, ¡pero ciertamente funcionó para nosotros!
Al igual que la mayoría de las personas que parecen encontrarse con este error, no estamos llamando explícitamente a Response.Flush () en ninguna parte de la aplicación. También estamos utilizando MVC, para el registro.
Reconozco que esto es muy antiguo, pero encontré otra razón para el error que podría aplicarse a otros. Si está utilizando MVC (estaba usando MVC 4 con .Net 4.0) y configura las páginas para que no sean almacenadas en búfer usando el elemento web.config
<pages buffer="false">
Entonces, si en su código intenta insertar datos en el objeto de la sesión, puede correr el riesgo de obtener este error si la página comenzó a renderizarse antes de que su vista secundaria o acción realice el acceso al estado de la sesión.
En tales casos, puede corregir el error cambiando la configuración del búfer anterior a verdadero. De forma alternativa, mueva el código de acceso de sesión a la vista principal y no a una vista secundaria / secundaria.