c# - Server.Transfer causando excepción de sesión
asp.net session (9)
¿Por qué no lo intentas así?
El método Server.Transfer también tiene un segundo parámetro: "preserveForm". Si establece esto en Verdadero, utilizando una declaración como Server.Transfer ("WebForm2.aspx", Verdadero), la cadena de consulta existente y cualquier variable de formulario seguirán estando disponibles para la página a la que está transfiriendo.
Así que creo que haciendo así tu sesión no caducará.
Server.Transfer("~/Error.aspx?ErrorID=" + errorId,True);
En mi global tengo el siguiente código para manejar cuando ocurre un error
//[..] code goes here
Server.Transfer("~/Error.aspx?ErrorID=" + errorId);
Solía ser un Response.Redirect
que funcionó perfectamente, excepto que cambió la URL (por lo que quiero usar Server.Transfer
)
Desafortunadamente, ahora cuando intenta cargar la página de error, se bloquea en la página maestra cuando intenta referirse a la Session
HttpException:
El estado de sesión solo se puede utilizar cuando enableSessionState se establece en verdadero, ya sea en un archivo de configuración o en la directiva de la página. Asegúrese también de que System.Web.SessionStateModule o un módulo de estado de sesión personalizado esté incluido en la sección // en la configuración de la aplicación.
Tengo enableSessionState tanto en mi configuración como en mi página.
También encontré algunos enlaces que sugieren el uso de Context.RewritePath, que solo hace que se cargue una página en blanco para mí.
El uso de Response.Redirect
funciona perfectamente y como se esperaba, por lo que asumo que Server.Transfer
es el problema aquí. ¿Qué es?
EDITAR Código:
protected void Application_Error(object sender, EventArgs e)
{
lock (_lockMe)
{
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.InnerException != null)
ex = ex.InnerException;
ErrorLoggingManager.AddError(ex, new MembershipData(), ...); //etc
}
Server.ClearError();
//Some other database code for cleaning up some stuff when an error happens
}
try
{
if (Response != null)
{
//Get the last error logged
MyDataContext db = new MyDataContext();
int errorId = db.LoggedErrors.OrderByDescending(le => le.ErrorId).Select(le => le.ErrorId).FirstOrDefault();
Server.Transfer("~/Error.aspx?ErrorID=" + errorId);
}
}
catch (Exception)
{
}
}
¿Por qué no usar simplemente customErrors en web.config para hacer la redirección?
<customErrors mode="Off" defaultRedirect="~/Common/Error.aspx">
<error statusCode="403" redirect="~/SM_AccessDenied.aspx" />
<error statusCode="404" redirect="~/Common/FileNotFound.aspx" />
</customErrors>
@ user2110845: Me había enfrentado a un problema similar hace unos meses. El problema era tener un guión bajo en el nombre del sitio web. Estábamos implementando un sitio web en IIS con dos nombres de host diferentes (agregando dos entradas a través de la opción ''Editar enlaces'' en el sitio web). Los nombres de host proporcionados fueron abc_ts, abc_is. Cuando se eliminó el guión bajo, el problema de la sesión se resolvió. Parece que hay ciertos caracteres no permitidos en un nombre de host del sitio web. Compruebe si ese es su problema. Encontré la respuesta aquí: link (marque ''actualización 2'' en el artículo)
Aquí está el problema:
Si hay una excepción de representación de página (por ejemplo, "Archivo no encontrado"), Server.Transfer arruina la sesión. Esto tiene algo que ver con que se llame durante el procesamiento de la página.
Siempre que no esté agregando encabezados antes de que se produzca el error, Response.Redirect funcionará bien; sin embargo, si está utilizando Response.AppendHeader, Response.Redirect no funcionará durante el procesamiento de una página.
Intente usar HttpContext.Current.RewritePath en su lugar. Eso debería solucionar todos estos problemas. Por alguna razón, a RewritePath () no le importa que la página no haya terminado de renderizarse.
Como no has publicado mucho código. Así que sin ver la implementación real que has hecho. Te podría sugerir debajo de los puntos.
Punto 1. En primer lugar, debe comprobar si SessionState
está enabled
para páginas. Podría establecerlos globalmente en web.config
archivo web.config
. Prueba el snippet
aparece a continuación en web.config
<configuration>
<system.web>
<pages enableSessionState="true" />
</system.web>
</configuration>
Punto 2. Y ponga su Redirection
en Application_Error
en Global.asax
.
public void Application_Error(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
app.Server.Transfer("~/Error.aspx?ErrorID=" + errorId,true);
}
Punto 3. También verifique si su SessionState
está configurado correctamente en IIS
también.
Los detalles están en MSDN para habilitar el estado de sesión.
Espero que esto ayude..!!!
El error que está encontrando es porque está usando un parámetro de cadena de consulta. Por la msdn docs
However, the path parameter must not contain a query string, or ASP returns an error.
http://msdn.microsoft.com/en-us/library/ms525800%28v=vs.90%29.aspx
Es alrededor de 3/4 del camino en la página justo por encima de los requisitos.
A pesar de que los documentos aquí están mencionando asp. y no asp.net, tenga en cuenta que el estado de la sesión es una característica de IIS y se maneja antes de que se llame a asp.net.
No menciona qué versión de ASP.NET está utilizando, pero hubo algunos cambios entre 2.0 y 3.5 en la forma en que las excepciones no manejadas se propagaron a través de una aplicación web ASP.NET y luego IIS.
Entre otros posibles, mientras Context.Response.TrySkipIisCustomErrors = true;
el error, no está configurando Context.Response.TrySkipIisCustomErrors = true;
Si bien esta bandera en particular no puede tener nada que ver con su problema (y solo está disponible para 3.5+), también puede ayudar a resolver lo que potencialmente son dos páginas de error detrás de la escena que ocultan el problema real. En cualquier caso, le ahorrará mucho dolor (al menos si está ejecutando más de 3.5) con otros problemas potenciales. Revise dos publicaciones que escribí hace varios años que pueden ser útiles: aunque no cubren el manejo de la sesión, sí cubren las múltiples rutinas de canto y baile que tuve que seguir para obtener el manejo adecuado de 500 y 404 en varias versiones de ASP .RED. Es posible que te encuentres con algo que te lleve más lejos, si no hasta el final.
http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message-(Redux-Covering-ASPNET-3540).aspx
http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message.aspx
Según entiendo, Server.Transfer envía el contenido de otra página al cliente en lugar del contenido solicitado. Si ese es el caso, entonces me pregunto si no tiene algo que ver con la aplicación de una página maestra a la página de error. Hace años tuve un error similar con la tecnología anterior y resultó que a la página maestra no le gustaba lo que estaba tratando de hacer.
Espero que esto ayude, al menos, a una solución.
Tuve el mismo problema en un contexto diferente hace un tiempo. No sé si es su caso, pero si está utilizando IIS7 en Windows 2008, además de configurar enableSessionState=true
en su web.config, debe colocar sus módulos dentro de la sección <system.webServer>
. en lugar de <system.web>
. Cambiar esta cosita me lo resolvió.