2009-05-25 18 views
61

que estoy recibiendo este fallo intermitente.¿Qué está causando “estado de sesión ha creado un identificador de sesión, pero no puede guardarlo porque la respuesta ya se inundó por la aplicación.”

me encontré con este enlace que resume bastante bien lo que era capaz de encontrar en el 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/

Básicamente se dice que usted puede intentar establecer el ajuste DisplayWhenNewSession web.config, o tratar de patear la cosa estado de sesión en la vida obteniendo Session.SessionID en Session_OnStart.

pero ¿alguien:

a) haber una explicación para esto

o incluso mejor, b) tienen una probada solución

me doy cuenta que no puedo tirar de la respuesta después de haciendo cualquier cosa 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: Pensándolo bien cuenta de que esto está ocurriendo cuando se transmite un archivo hasta el 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.

+1

Tengo exactamente el mismo problema. La única razón por la que lo vi fue cuando puse el manejo de excepciones en Global.asax. Es muy intermitente ¡Sería genial si alguien supiera la respuesta a esto! –

+6

El enlace ahora está roto :-( – Casebash

+0

Enlace de máquina Wayback: https://web.archive.org/web/20090208233145/http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-can-save-it-because-the-response-was-already-flushed-by-the-application/ – lorenzog

Respuesta

64

¡Tengo!

En el archivo global.asax hacer 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!

+0

¿Es este un método público/protegido? Dado que es privado, supongo que debería estar protegido. ¿Está completa la muestra, el hecho de que la sessionID no está guardada, supongo que está bien, es el inicio de la creación lo que es importante, ¿no? –

+0

Gracias. Creo que esto generalmente funciona, así que lo marcaré como respuesta aceptada, aunque no estoy 100% seguro. ¿Alguien puede comentar por favor si encuentran un caso donde esto no funciona? Gracias. –

+0

Simplemente agregué este método a mi archivo global.asax y eliminó mi mensaje de error, que era lo mismo que la pregunta, muchas gracias eitama! – vanhornRF

6

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 representación.

asegurar que nunca hacer nada que pueda desencadenar resultado de la página hasta después de la etapa de PreRender.

+0

Gracias , Voy a echarle un vistazo a eso esta noche. No estoy seguro de por qué sería intermitente sin embargo? –

+0

un Response.Write condicional() en un evento inapropiado tal vez? –

3

Tras haber funcionado en este problema por mí mismo, pensé que me gustaría compartir mis hallazgos.

El ajuste DisplayWhenNewSession web.config es irrelevante, ya que sólo se aplica a una CustomControl particular, en CodePlex (lo siento que he perdido el enlace).

La otra sugerencia parece funcionar al inicializar el 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!

Como la mayoría de las personas que parecen funcionar en este error, no estamos pidiendo explícitamente Response.Flush() en cualquier lugar de la aplicación. También estamos utilizando MVC, para el registro.

18

Este error se parece a aparecer cuando:

  • que la aplicación arranque

  • Usted está utilizando un Global.asax incluso si está haciendo algo en los eventos Session_Start/final o no

  • Su aplicación obliga al ras de la respuesta demasiado pronto

  • no se está usando el Sessio n antes de la descarga

Se elevó por el estado de la sesión cuando se trata de salvar el Id.sesión sobre la liberació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 identificador de sesión para ser salvo en la versión de SessionStateModule (¿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 cadena sessionId = Session.SessionID; Truco evitar el problema.

Supongo que solo aparece en el inicio de la aplicación debido a comportamientos de inicialización.

Soluciones/trucos:

  • Evitar el lavado en Page_Load como ya se dijo

  • desactivarlo estado de sesión en la página (EnableSessionState)

  • Usar el truco SessionID antes de la descarga

  • Use Response.End() en lugar de .Flush() si no se preocupan por los errores que pueden ocurrir después de su ras

0

Reconozco que esto es muy antiguo, pero he encontrado otra razón para el error que podría aplicarse a otros. Si está utilizando MVC (yo estaba usando MVC 4 con .Net 4.0) y se establece a páginas no amortiguar usando el elemento web.config

<pages buffer="false">  

Entonces, si en el código intenta enviar datos a la objeto de sesión, puede arriesgarse a 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 el ajuste tampón anterior a la verdadera. De forma alternativa, mueva el código de acceso de sesión a la vista principal y no a una vista secundaria/secundaria.

Cuestiones relacionadas