2010-11-26 6 views
5

¿Cuál sería una buena manera de restringir una aplicación web ASP.NET para que solo sirva una cantidad dada de usuarios simultáneos?¿Cómo implementar licencias flotantes en ASP.NET?

Algunos de los requisitos son:

  • La aplicación requiere inicio de sesión (no hay necesidad de preocuparse por los usuarios anónimos).
  • Compatibilidad con varios servidores (equilibrio de granja/carga).
  • Se puede considerar que un usuario activo es lo mismo que una sesión activa (no firmado o caducado).
  • Deben denegarse los inicios de sesión adicionales si se ha alcanzado el número máximo de usuarios simultáneos.
  • Se necesita responsabilidad (los administradores deberían poder ver quiénes son los usuarios activos).
  • Gastos generales mínimos en cada solicitud web (especialmente evitando viajes costosos a una base de datos en cada solicitud).
  • El número total de usuarios concurrentes debe mantenerse correcto incluso si un servidor web se cuelga, se desconecta de la red o debe reiniciarse.
  • Hay servidores adicionales disponibles para los servicios de host (por ejemplo, servidores de aplicaciones).
+0

Parece que se trata de una cuestión de copiar y pegar de una especificación de requisitos. Cosas como "Responsabilidad es necesaria" y restringir a los usuarios concurrentes son dos cosas totalmente diferentes. Creo que deberías considerar hacer solo la pregunta específica aquí. – Illuminati

+0

:) De hecho, acabo de tipear esto, soy el tipo que escribe las especificaciones. Quiero decir que cualquier método que se aplique debe ser lo suficientemente transparente para que los administradores puedan ver quién piensa que la aplicación está conectada cuando se alcanza el límite. –

+0

Probablemente un HttpModule? Lo más probable es que necesite implementar esta lógica en los eventos 'AuthenticateRequest' y' PostAuthenticateRequest'. http://msdn.microsoft.com/en-us/library/ms178473.aspx –

Respuesta

0

Para restringir el número de usuarios simultáneos que debería ser capaz de usar,

<system.web> 
     <applicationPool maxConcurrentRequestsPerCPU="12" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000"/> 
</system.web> 

http://blogs.msdn.com/b/rakkimk/archive/2009/07/08/iis7-improving-asp-net-performance-concurrent-requests-while-on-integrated-mode.aspx

+0

Gracias, pero eso son solicitudes concurrentes, no es compatible con el concepto de usuario, por lo que no creo que se pueda utilizar para implementar un modelo de licencia flotante. Necesito limitar la cantidad de usuarios que pueden registrarse en la aplicación web, con sesiones activas. –

+0

Sí, claro ... no he encontrado ninguna forma de lograrlo solo con la configuración ... ¿Debería pensar en hacer una implementación personalizada para hacer un seguimiento de los usuarios actuales a través de la lógica de inicio de sesión? – Illuminati

+0

Estoy de acuerdo; en esta pregunta estoy tratando de descubrir cuáles serían los buenos enfoques para eso. Gracias. –

2

se puede utilizar una variable global (estática) y conectar la lógica en su Application_OnStart, Application_BeginRequest o eventos Page_Load. Consulte esto para obtener un ejemplo más: http://dotnetperls.com/global-variables-aspnet

+0

Esto resuelve parte del problema; podría permitir el seguimiento de los usuarios activos en un servidor, pero para rastrear en una granja de servidores, parece que se necesitaría una implementación más elaborada. –

+0

Ah, sí, tienes razón. El estado de la sesión se puede mover fuera del proceso y estaba confundiendo el estado de la sesión con el estado de la aplicación. El estado de la aplicación es en realidad muy volátil (el cambio de web.config hará que el estado de la aplicación se vacíe, por ejemplo), por lo que un mejor enfoque sería utilizar algún tipo de almacenamiento sin conexión, como SQL Server.Debería tener algún tipo de agente fuera de proceso para administrar el almacenamiento de la base de datos para que todos los servidores de una topología de servidores o de jardines web puedan acceder a él. – SRM

+0

Gracias. Sí, parece que se requerirá un servicio para agregar la información de los usuarios activos en toda la comunidad de servidores. Prefiero no usar una base de datos para evitar la contención en el servidor de la base de datos. Parece que una lista en memoria será suficiente. –

Cuestiones relacionadas