Pregunta: ¿Por qué ocasionalmente se pierde la sesión en algunas máquinas?
Respuesta: Puede estar relacionado con el entorno de la máquina, como el firewall o el software antivirus. Intente apagar el firewall.
P: ¿Por qué no se activa el método Session_End cuando se llama a Session.Abandon?
Respuesta: En primer lugar, el método Session_End solo admite sesión de tipo InProc (en proceso). En segundo lugar, para activar el método Session_End, la sesión debe existir (es decir, la sesión se ha utilizado en el sistema) y se debe completar al menos una solicitud (este método se llamará en esta solicitud).
P: ¿Por qué mi sesión se pierde a menudo cuando la uso en modo InProc?
Respuesta: Este problema generalmente se debe a que la aplicación se recicla, porque cuando se usa la sesión en proceso, la sesión se guarda en el proceso aspnet_wp. Cuando el proceso se recicla, la sesión naturalmente desaparecerá. reciclado, puede utilizar Consulte el Visor de eventos de su sistema para obtener información.
Para obtener información específica, consulte:
Las variables de sesión se pierden de forma intermitente en aplicaciones ASP.NET
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
También hubo un error en 1.0 que causaba que el proceso de trabajo se reciclara y reiniciara. Este error se corrigió en 1.1 y sp2.
Para obtener información detallada sobre este error, consulte:
El proceso de trabajo ASP.NET (Aspnet_wp.exe) se recicla inesperadamente.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
Pregunta: ¿Por qué el ID de la nueva sesión es el mismo que el original después de que la sesión expira o está abandonada?
Respuesta: Debido a que el ID de sesión se guarda en la instancia del navegador del cliente, cuando la sesión expire y se restablezca en el servidor, se utilizará el ID de sesión pasado por el navegador. Por lo tanto, después de que expire el tiempo de sesión, el ID de sesión no cambiará una vez restablecido.
P: ¿Por qué el ID de sesión es diferente para cada solicitud?
Respuesta: Este problema puede deberse a que no se guarda ninguna información en la Sesión, es decir, la Sesión no se utiliza en ninguna parte del programa. Una vez guardada la información en la sesión, el ID de sesión siempre estará relacionado con el navegador y el ID de sesión no cambiará en este momento.
P: ¿Se puede compartir la sesión entre ASP y ASP.NET?
Respuesta: Sí. Pero este es un proceso relativamente complicado. Microsoft proporciona una solución oficial. Consulte: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.aspQ.
: ¿Qué tipos de objetos se pueden guardar en la sesión?
Respuesta: Esto depende del modo de sesión utilizado. Cuando se utiliza una sesión en proceso (InProc), cualquier objeto se puede guardar fácilmente. Si utiliza un modo que no es InProc, solo puede guardar objetos que se pueden serializar y deserializar. Si el objeto guardado en este momento no admite la serialización, no se puede guardar en la sesión de este modo (que no es InProc).
P: ¿Por qué no puedo usar los métodos Response.Redirect y Server.Transfer en Session_End para saltar a una página?
Respuesta: Session_End es una función de procesamiento de eventos que se activa dentro del servidor. Se basa en un temporizador dentro del servidor. Cuando se activa el evento, no hay ningún objeto HttpRequest relevante en el servidor, por lo que los métodos Response.Redirect y Server.Transfer no se pueden utilizar en este momento.
P: ¿Puedo obtener el objeto HttpContext en Session_End?
Respuesta: No, porque este evento no está asociado con ninguna solicitud (Solicitud) y no tiene un contexto basado en la solicitud.
Pregunta: ¿Cómo utilizar la sesión en el servicio web?
Respuesta: Para utilizar la sesión en el servicio web, la persona que llama al servicio web debe realizar un trabajo adicional y la cookie utilizada al llamar al servicio web debe guardarse y almacenarse. Para obtener más información, consulte la documentación de MSDN para la propiedad HttpWebClientProtocol.CookieContainer. Sin embargo, si utiliza un servidor proxy para acceder al servicio web debido a limitaciones del marco, ambos no pueden compartir la sesión.
Pregunta: ¿Por qué no puedo usar Session cuando personalizo mi propio HttpHandler?
Respuesta: Al implementar su propio HttpHandler, si desea utilizar Session, debe implementar una de las dos interfaces de marca siguientes: IRequiresSessionState e IReadOnlySessionState. Estas interfaces no tienen ningún método que deba implementarse. Son solo una interfaz de marca. el método de uso de la interfaz INamingContainer.
P: Cuando uso webfarm, ¿por qué se pierde la sesión cuando redirijo a otro servidor web?
Respuesta: Para obtener información detallada, consulte:
PRB: El estado de la sesión se pierde en Web Farm si utiliza el modo de sesión SqlServer o StateServer
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: ¿Por qué mi sesión no es válida en el método Application_OnAcquireRequestState?
Respuesta: La sesión solo será válida después de que se llame al evento HttpApplication.AcquireRequestState.
Para obtener información detallada, consulte:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
P: ¿Cómo puedo dirigir desde una página HTTP a HTTPS si se utiliza sin cookies?
Respuesta: Pruebe los siguientes métodos:
Cadena originalUrl = "/fxtest3/sub/foo2.aspx";
Cadena modificadaUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
P: ¿La sesión es válida en esos eventos en global.asax?
Respuesta: La sesión solo es válida después del evento AcquireRequestState y los eventos posteriores a este evento pueden usar la sesión.
P: ¿Cómo guardar todos los objetos en la sesión actual?
Respuesta: Se puede obtener atravesando todas las Session.Keys. El código es el siguiente:
Colección de sesiones ArrayList = nueva ArrayList();
foreach (cadena strKey en Session.Keys){
sessionCollection.Add(Session[strKey]);
}
P: ¿Es posible compartir sesiones en diferentes aplicaciones?
Respuesta: No se puede compartir directamente. Puede consultar cómo compartir sesión entre ASP y ASP.NET.
P: ¿Cuál es la diferencia entre Session.Abandon y Session.Clear?
Respuesta: La principal diferencia es que cuando se usa Session.Abandon, se llama al método Session_End (en modo InProc). El método Session_Start se activará cuando llegue la siguiente solicitud. Session.Clear solo borra todos los datos de la sesión y no finaliza la sesión, por lo que no se llamarán esos métodos.
Pregunta: Para acceder al valor de estado de la sesión de forma secuencial, ¿la sesión proporciona un mecanismo de bloqueo?
Respuesta: Session implementa el mecanismo de bloqueo de lector/escritor:
Cuando la página tiene capacidades de escritura para la sesión (es decir, la página tiene la etiqueta <%@ Page EnableSessionState="True" %>), la sesión de la página mantiene un bloqueo de escritura hasta que se completa la solicitud.
Cuando la página tiene funcionalidad de solo lectura para la sesión (es decir, la página tiene la etiqueta <%@ Page EnableSessionState="ReadOnly" %>), la sesión que solicitó la finalización de la página mantiene un bloqueo de lectura.
Un bloqueo de lectura bloqueará un bloqueo de escritura; un bloqueo de lectura no bloqueará un bloqueo de lectura; un bloqueo de escritura bloqueará todos los bloqueos de lectura y escritura. Es por eso que cuando la misma página en dos cuadros escribe en la misma sesión, uno de ellos tiene que esperar a que el otro (el un poco más rápido) se complete antes de comenzar a escribir.
P: ¿Qué significa el tiempo de espera sin interrupciones de la sesión?
Respuesta: El tiempo de espera sin interrupciones de la sesión significa que siempre que su página acceda (use) la sesión, el tiempo de espera se actualizará (puede entenderse como reprogramación), es decir, el tiempo de espera se volverá a calcular a partir de la solicitud de la página. Sin embargo, la página no puede desactivar la sesión. Accederá automáticamente a la sesión de la página actual y actualizará el tiempo de espera.
Pregunta: ¿Por qué la sesión no es válida en la función de manejo de eventos en global.asax?
Respuesta: Depende de en qué función de manejo de eventos se use la sesión. La sesión solo es válida después del evento AcquireRequestState. Todas las funciones de manejo de eventos posteriores a este evento pueden usar la sesión, pero no las anteriores.
Pregunta: Cuando escribo un componente que depende de la sesión de la aplicación actual, ¿por qué no puedo usar la sesión ["Clave"] directamente para obtener su valor?
Respuesta: Session["Key"] es en realidad this.Session["Key"], que se proporciona como una propiedad de Page, por lo que no puede usar esta propiedad directamente en su componente. Puede utilizar la sesión de las siguientes maneras:
HttpContext.Current.Session["Key"] = "Mi valor de Seesion";
P: Cuando uso el modo InProc para guardar la sesión, ¿dónde se guarda la sesión en este momento?
Respuesta: Los diferentes IIS tienen diferentes métodos de procesamiento.
Cuando se utiliza IIS5, la sesión se guarda en el espacio de proceso de aspnet_wp.exe.
Cuando se utiliza IIS6, todas las aplicaciones comparten el grupo de aplicaciones de forma predeterminada y la sesión se guarda en el espacio de proceso de w3wp.exe.
P: ¿El tiempo de espera de la sesión está configurado en minutos o segundos?
Respuesta: Son minutos, el valor predeterminado es 20 minutos.
P: ¿Se guardará mi sesión cuando ocurra un error en la página? Necesito realizar alguna limpieza en Session_End, pero falla, ¿por qué?
Respuesta: Session_End solo se ejecutará cuando la sesión se ejecute en modo InProc. La cuenta utilizada por Session_End es la cuenta que ejecuta el proceso de trabajo aspnet_wp (esto se puede configurar en machine.config). Por lo tanto, si usa seguridad integrada para conectarse a SQL en el método Session_End, se abrirá el enlace usando la cuenta del proceso aspnet_wp, y el éxito o el fracaso en este momento depende de su configuración de seguridad de SQL.
Pregunta: ¿Por qué pierdo la sesión cuando redirijo cuando configuro sin cookies en verdadero?
Respuesta: Cuando utilice sin cookies, debe utilizar rutas relativas para reemplazar las rutas absolutas en el programa. Si utiliza rutas absolutas, ASP.NET no podrá guardar el ID de sesión en la URL.
Por ejemplo: reemplace myDirmySubdirdefault.aspx con ..default.aspx.
Pregunta: ¿Cómo almacenar SortedList en sesión o caché?
Respuesta: Consulte los siguientes métodos:
Lista Ordenada x = nueva Lista Ordenada();
x.Add("Clave1", "ValorA");
x.Add("Clave2", "ValorB");
Guardar en sesión:
Sesión["ListaOrdenada1"] = x;
Utilice el siguiente método para obtenerlo:
Lista Ordenada y = (Lista Ordenada) Sesión["Lista Ordenada1"];
Lo mismo ocurre con Chahe.
P: ¿Por qué aparece el mensaje de error "El estado de la sesión sólo se puede utilizar cuando enableSessionState está establecido en verdadero, ya sea en un archivo de configuración o en la directiva de página"?
Respuesta: Este problema puede ocurrir después de instalar Windows Sharepoint Server (WSS) en una máquina que tiene instalado el entorno de desarrollo Microsoft Visual Studio .NET.
El filtro WSS ISAPI manejará todas las solicitudes. Cuando explora una aplicación ASP.NET a través de un directorio virtual, el filtro ISAPI no asigna URL al directorio de carpetas.
La solución es: no utilice Session en la máquina donde está instalado WSS.
Para obtener información detallada, consulte:
El estado de sesión no se puede utilizar en ASP.NET con Windows SharePoint Services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: ¿Cómo eliminar variables de sesión?
Respuesta: Si desea eliminar la variable de sesión, puede utilizar el método HttpSessionState.Remove().
P: ¿Existe alguna forma de saber cuánta memoria ocupa la sesión de una aplicación mientras se ejecuta?
Respuesta: No. Por el momento, este valor no se puede verificar, al menos todavía no he visto ninguna información al respecto. Sin embargo, se puede estimar aproximadamente un valor a través del monitor de rendimiento y el código del programa.
Pregunta: Cuando hay un conjunto de marcos en la página, se descubre que el ID de sesión de la página que se muestra en cada marco es diferente en la primera solicitud.
Respuesta: La razón es que su conjunto de marcos se coloca en una página html en lugar de una página ASPX.
En circunstancias normales, si el conjunto de marcos es una página aspx, cuando solicita la página, primero envía la solicitud al servidor web y se obtiene el ID de sesión. Luego, el navegador solicitará otras páginas en el marco respectivamente, de modo que el conjunto de marcos sea una página aspx. SessionID de todas las páginas Es lo mismo, es el SessionID de la página FrameSet.
Sin embargo, si utiliza una página HTML para crear una página FrameSet, la primera solicitud será la página HTML. Cuando la página regresa del servidor, no se genera ninguna sesión. Luego, el navegador solicitará las páginas en el marco. Las páginas generarán su propio SessionID, por lo que en este caso surge este problema. Cuando actualice la página, el ID de sesión será el mismo y será el ID de sesión de la última página solicitada.
P: ¿Es posible guardar sesiones de diferentes aplicaciones en diferentes bases de datos en el mismo servidor SQL Server?
Respuesta: Sí, consulte:
REVISIÓN: El uso de una base de datos SQL para todas las aplicaciones para el estado de sesión de SQL Server puede causar un cuello de botella
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: ¿Puedo obtener objetos HttpSessionState y HttpContext válidos en Session_End?
Respuesta: Puede obtener el objeto HttpSessionState en este método y puede acceder a él directamente mediante Session. Sin embargo, el objeto HttpContext no se puede obtener porque el evento no está asociado con ninguna solicitud, por lo que no hay ningún objeto de contexto.
P: Cuando uso la sesión en modo SQL Server, ¿por qué mi sesión no caduca?
Respuesta: En el modo SqlServer, la caducidad de la sesión se completa mediante el registro del Agente SQL. Compruebe si su Agente SQL se está ejecutando.
P: Después de configurar EnableSessionState en "ReadOnly", aún puedo modificar el valor de la sesión en modo InProc. ¿Por qué ocurre esto?
Respuesta: Incluso si EnableSessionState está marcado como Solo lectura, los usuarios aún pueden editar la sesión en modo InProc. La única diferencia es que la sesión no se bloqueará durante la solicitud.
P: ¿Cómo puedo evitar especificar una contraseña al vincular SQL?
Respuesta: Utilice un enlace confiable o utilice una cadena de enlace cifrada. Para obtener más información sobre esto, consulte:
Cómo utilizar la utilidad ASP.NET para cifrar credenciales y cadenas de conexión del estado de sesión
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290Q
: ¿Cómo debo usar Session en mi propia clase?
Respuesta: Puede utilizar HttpContext.Current.Session. El método específico es el siguiente:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
De manera similar, puede utilizar el objeto Aplicación de esta manera.
P: ¿Por qué mi solicitud se bloquea después de cambiar al modo SQL Server?
Respuesta: Compruebe si todos los objetos guardados en la sesión se pueden guardar en modo SQL Server, es decir, estos objetos deben admitir la serialización.
Pregunta: ¿Cuál será el impacto cuando la sesión esté configurada sin cookies?
Respuesta: Cuando el valor sin cookies se establece en verdadero, existen principalmente las siguientes restricciones:
1. No se pueden utilizar enlaces absolutos en la página.
2. Además de cambiar entre HTTP y HTTPS, se deben completar algunos otros pasos en la aplicación.
Si envía un enlace a otra persona, la URL en este momento contendrá información de ID de sesión, por lo que las dos personas compartirán una sesión.
P: ¿Se puede guardar la sesión en la base de datos?
Respuesta: Por supuesto, para obtener más detalles, consulte: http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
--------------- -------------------------------------------------- -------------------------------------------------- -- -
P: ¿Por qué mi sesión se pierde a menudo cuando la uso en modo InProc?
Una situación adicional: si utiliza una base de datos de Access, para evitar que la base de datos se descargue, algunas personas pueden pensar en colocar el archivo de la base de datos en el directorio bin para que la base de datos no se pueda descargar. Sin embargo, si está en modo InProc. , esto también provocará la pérdida de la sesión. Porque al acceder a la aplicación, los datos se escribirán en la base de datos con frecuencia, lo que provocará cambios en los archivos de la base de datos ubicados en el directorio bin, y las modificaciones en el directorio bin provocarán la pérdida de la sesión.
Para resolver este problema, puede cambiar la ruta de almacenamiento del archivo de la base de datos o utilizar el modo StateServer o SqlServer.
Para obtener más información, consulte:
PRB: Los datos de la sesión se pierden cuando se utiliza el modo de estado de sesión ASP.NET InProc
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- -----------------------
Sesión compartida multiproyecto en Asp.net seleccionada del Blog de dnyz
http://dev.csdn.net/article/21/21714.shtm
1. Cree una solución en blanco, como por ejemplo: d:MyProjectMyProject.sln
2. Cree un directorio raíz de la aplicación web d:MyProjectWebMis en d:MyProject y configúrelo en el directorio virtual de http://localhost/WebMis.
3. Cree nuevos directorios según los módulos en el directorio WebMis, como por ejemplo: d:MyProjectWebMisLogin y d:MyProjectWebMisCheckOut.
4. Cree una nueva aplicación web basada en el módulo en VS.net, como: http://localhost/WebMis/Login y http://localhost/WebMis/CheckOut
5. Después de la creación, los directorios de inicio de sesión y pago se configuran automáticamente como directorios virtuales.
6. Agregue referencias de proyecto para iniciar sesión y pagar en el proyecto WebMis.
7. Elimine los directorios virtuales de Inicio de sesión y Pago en el Administrador de IIS.
8. Elimine el global.asax de cada proyecto (elimine el proyecto raíz)
9. Elimine el siguiente código en web.config del proyecto (elimine el proyecto raíz):
<modo de autenticación="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="fuente de datos=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
O elimine web.config (si no necesita configurarlo en cada directorio)
10. Después de la compilación, se puede ejecutar.