2010-05-19 32 views
14

Tengo un sitio web en C#/ASP.NET que se encuentra actualmente en desarrollo. Cuando estamos en producción, me gustaría hacer lanzamientos con frecuencia a lo largo del día, ya que corregimos errores y agregamos características (como esta: http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/).Despliegue continuo con un sitio web ASP.NET?

Si carga una nueva versión del sitio o incluso cambia un solo archivo, descarta a los usuarios que están actualmente conectados y los hace iniciar sobre cualquier formulario y tal. ¿Existe un secreto para poder realizar implementaciones sin interferir con los usuarios de los sitios .NET?

+8

Creo que debe cambiar la forma en que está almacenando las sesiones. Creo que debe ir al almacenamiento basado en archivos o basado en sql. Creo que estás actualizándolos en el proceso, que creo que los almacena en el espacio de memoria del grupo de aplicaciones. No puedo dar más detalles, lo siento –

+1

@hamlin que es correcto –

+1

@hamlin, eso es digno de una respuesta. – roufamatic

Respuesta

5

Si realiza un cambio en un archivo de configuración, el contenido de una carpeta bin de la aplicación, o cosas por el estilo, el proceso de trabajo ASP.NET se reinicia junto con su aplicación.

Esto da como resultado la eliminación de sesiones y la expulsión de usuarios.

La solución es utilizar otros métodos de almacenamiento de sesión que no sean el predeterminado InProc.
Puede lograr esto configurando session state mode. Las opciones SqlServer y StateServer proporcionan un buen remedio para su problema.

SqlServer modo es relativamente fácil de configurar y poner en funcionamiento.(Básicamente, es solo crear una base de datos, ejecutar aspnet_regsql y luego especificarla en la configuración.) Si no tiene MS SQL Server o no quiere usarlo, puede usar StateServer, o crear su propio proveedor y use el modo Custom.

La única restricción es que solo puede almacenar valores serializables con los modos SqlServer y StateServer.

+0

Estoy de acuerdo en que es una sesión y me doy cuenta de que estoy respondiendo esto mucho después de la pregunta original (bueno). Nos encontramos con problemas con el bloqueo de estado del servidor SQL con mayores cargas de tráfico. Terminamos yendo con Microsoft AppFabric Cache, que es lo que usa MS Azure. Hasta ahora, esa ha sido una solución sólida para nosotros. – ctc

5

La razón por la que está viendo esto es porque está restableciendo el grupo de aplicaciones, restableciendo así la sesión de todos.

La ruta más limpia sería descargar su sesión a un servidor de estado de sesión o minimizar el uso de la sesión.

Una forma de evitar esto es que si no puede descargar su sesión es desplegar siempre en un nuevo directorio virtual. Tu URL pública simplemente redirecciona a tu última versión. Todos los usuarios que ya han iniciado sesión seguirán utilizando la versión anterior, pero los nuevos usuarios utilizarían la nueva versión.

0

Supongo que los usuarios son expulsados ​​porque el proceso de aplicación del servidor web se reinicia. Por defecto, las sesiones de usuario se almacenan en la memoria y los datos de la sesión se eliminan. El proveedor de sesión es la opción configurable en web.config. Puede ser que elegir proveedor de sesión externo (proceso de aplicación fuera de la web) sea un paso hacia lo que está esperando.

0

Hay dos alternativas para conseguir que:

  1. no utilice Sesión en absoluto. (Puede usar cookies para autenticación)
  2. Use otro modo de estado de sesión. Servidor de estado o SQLServer. http://msdn.microsoft.com/en-us/library/ms178586(v=VS.80).aspx

De cualquier forma también obtendrá la flexibilidad de poder ejecutar su aplicación en múltiples servidores para rendimiento o clustering a prueba de errores.

0

Dependiendo de lo que almacene en el objeto Session, puede ser capaz de reconstruirlo en el controlador Session_Start de Global.asax. Solía ​​hacer esto en una aplicación interna donde solo almacenamos la identidad del usuario en la sesión, por lo que podíamos usar su cookie de autorización para recrear la sesión.

Una cosa a tener en cuenta si haces esto: digamos que un usuario carga un formulario y luego se va a almorzar, y actualizas esa página mientras están ausentes. Si vuelven a su escritorio y envían el formulario, enviarán la versión anterior del formulario al nuevo código subyacente.

+0

Tampoco estoy seguro, pero tendrías que hacer algo explícito y sería un posible punto de falla. Tal vez algún tipo de versionado de formularios, para que el formulario pueda ver si el usuario está publicando y no está actualizado a un código subyacente actualizado. De todos modos, no es algo de lo que tenga que preocuparse si no puede usar el método de cookie de todos modos :) –

Cuestiones relacionadas