2010-11-26 7 views
5

Quel serait un bon moyen de restreindre une application Web ASP.NET pour ne desservir qu'un nombre donné d'utilisateurs simultanés?Comment implémenter des licences flottantes dans ASP.NET?

Certaines exigences sont les suivantes:

  • application nécessite une connexion (pas besoin de se soucier des utilisateurs anonymes).
  • Prise en charge de plusieurs serveurs (batterie/équilibrage de charge).
  • Un utilisateur actif peut être considéré comme identique à une session active (pas déconnecté ou expiré).
  • Les connexions supplémentaires doivent être refusées si le nombre maximal d'utilisateurs simultanés a été atteint.
  • La reddition de comptes est nécessaire (les administrateurs devraient être en mesure de voir qui sont les utilisateurs actifs).
  • Charge minimale sur chaque requête Web (en évitant notamment les déplacements coûteux vers une base de données à chaque requête).
  • Le nombre total d'utilisateurs simultanés doit rester correct même si un serveur Web se bloque, se déconnecte du réseau ou doit être redémarré.
  • Des serveurs supplémentaires sont disponibles pour héberger des services (par exemple des serveurs d'applications).
+0

Il semble que ce soit un copier-coller d'une spécification d'exigence. Des choses comme «La responsabilité est nécessaire» et restreindre les utilisateurs simultanés sont deux choses totalement différentes. Je pense que vous devriez envisager de poser seulement la question spécifique ici? – Illuminati

+0

:) En fait, je viens de taper ceci, je suis le gars qui écrit les spécifications. Je veux dire que quelle que soit la méthode appliquée, elle devrait être suffisamment transparente pour permettre aux administrateurs de voir à qui l'application pense être connecté lorsque la limite est atteinte. –

+0

Probablement un HttpModule? Vous aurez probablement besoin d'implémenter cette logique dans les événements 'AuthenticateRequest' et' PostAuthenticateRequest'. http://msdn.microsoft.com/en-us/library/ms178473.aspx –

Répondre

0

Pour limiter le nombre d'utilisateurs simultanés que vous devriez être en mesure d'utiliser,

<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

Merci, mais ce sont des demandes concurrentes, cela ne supporte pas le concept d'un utilisateur, donc je ne pense pas qu'il puisse être utilisé pour implémenter un modèle de licence flottante. J'ai besoin de limiter le nombre d'utilisateurs qui peuvent être connectés sur l'application web, avec des sessions actives. –

+0

Ouais bien .. je n'ai pas trouvé de moyen de l'atteindre par la configuration seule .. Vous devriez probablement penser à faire une implémentation personnalisée pour garder une trace des utilisateurs actuels grâce à la logique de connexion? – Illuminati

+0

Je suis d'accord; Dans cette question, j'essaie de savoir quelles seraient les bonnes approches pour cela. Merci. –

2

Vous pouvez utiliser une variable globale (statique) et brancher la logique dans votre Application_OnStart, Application_BeginRequest ou les événements Page_Load. Consultez ceci pour plus d'un exemple: http://dotnetperls.com/global-variables-aspnet

+0

Cela résout une partie du problème; il pourrait permettre de suivre les utilisateurs actifs sur un serveur, mais pour suivre à travers une ferme de serveurs, il semble qu'une implémentation plus élaborée serait nécessaire. –

+0

Ah, oui, vous avez raison. L'état de session peut être retiré du processus et je confondais l'état de la session avec l'état de l'application. L'état de l'application est en fait très instable (changer web.config provoquera le vidage de votre état d'application par exemple), donc une meilleure approche consisterait à utiliser une sorte de stockage hors ligne, tel que le serveur SQL.Vous devez disposer d'une sorte d'agent de processus pour gérer ce stockage de base de données afin qu'il soit accessible à tous les serveurs d'une batterie de serveurs ou d'une topologie Web. – SRM

+0

Merci. Oui, il semble qu'un service serait nécessaire pour agréger les informations des utilisateurs actifs à travers la batterie de serveurs. Je préfère ne pas utiliser une base de données pour éviter les conflits sur le serveur de base de données. Il semble qu'une liste en mémoire suffira. –

Questions connexes