2010-11-26 11 views
5

Quale sarebbe un buon modo per limitare un'applicazione Web ASP.NET a servire solo un determinato numero di utenti simultanei?Come implementare le licenze mobili in ASP.NET?

Alcuni requisiti sono:

  • applicazione richiede login (non c'è bisogno di preoccuparsi per gli utenti anonimi).
  • Supporto di più server (farm/load balancing).
  • Un utente attivo può essere considerato uguale a una sessione attiva (non firmato o scaduto).
  • Gli accessi aggiuntivi devono essere negati se è stato raggiunto il numero massimo di utenti simultanei.
  • La responsabilità è necessaria (gli amministratori dovrebbero essere in grado di vedere chi sono gli utenti attivi).
  • Overhead minimo su ciascuna richiesta Web (in particolare evitando costosi viaggi verso un database per ogni richiesta).
  • Il numero totale di utenti concorrenti deve essere mantenuto corretto anche se un server Web si blocca, si disconnette dalla rete o deve essere riavviato.
  • Sono disponibili server aggiuntivi per servizi host (ad esempio server applicazioni).
+0

Sembra che questa sia una domanda copia e incolla da una specifica dei requisiti. Cose come "La responsabilità è necessaria" e la limitazione degli utenti concorrenti sono due cose completamente diverse. Penso che dovresti considerare di chiedere solo la domanda specifica qui? – Illuminati

+0

:) In effetti ho appena scritto questo, sono il ragazzo che scrive le specifiche. Intendo dire che qualunque metodo venga applicato dovrebbe essere abbastanza trasparente da consentire agli amministratori di vedere a chi l'applicazione pensa di aver effettuato l'accesso quando viene raggiunto il limite. –

+0

Probabilmente un HttpModule? Molto probabilmente dovrai implementare questa logica negli eventi 'AuthenticateRequest' e' PostAuthenticateRequest'. http://msdn.microsoft.com/en-us/library/ms178473.aspx –

risposta

0

Per limitare il numero di utenti simultanei si dovrebbe essere in grado di utilizzare,

<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

Grazie, ma si tratta di richieste simultanee, non supporta il concetto di utente, quindi non penso che possa essere utilizzato per implementare un modello di licenza mobile. Devo limitare la quantità di utenti che possono essere registrati nell'applicazione Web, con sessioni attive. –

+0

Sì right..i non ho incontrato alcun modo di raggiungerlo attraverso la configurazione da solo .. Probabilmente si dovrebbe pensare di fare un'implementazione personalizzata per tenere traccia degli utenti correnti attraverso la logica di accesso? – Illuminati

+0

Sono d'accordo; in questa domanda sto cercando di scoprire quali sarebbero i migliori approcci per questo. Grazie. –

2

è possibile utilizzare una variabile globale (statico) e collegare la logica nel vostro Application_OnStart, Application_BeginRequest o Page_Load events. Dai un'occhiata a questo per un altro esempio: http://dotnetperls.com/global-variables-aspnet

+0

Ciò risolve parte del problema; potrebbe consentire di tracciare gli utenti attivi su un server, ma per tracciare attraverso una server farm, sembra che sarebbe necessaria un'implementazione più elaborata. –

+0

Ah, sì, hai ragione. Lo stato della sessione può essere spostato al di fuori del processo e ho confuso lo stato della sessione con lo stato dell'applicazione. Lo stato dell'applicazione è in realtà molto volatile (la modifica di web.config causerà lo svuotamento dello stato dell'applicazione, ad esempio), per cui un approccio migliore sarebbe utilizzare una sorta di spazio di archiviazione offline, ad esempio SQL server.Dovresti disporre di una sorta di agente fuori processo per gestire l'archiviazione del database in modo che sia accessibile da tutti i server in una topologia di server farm o web garden. – SRM

+0

Grazie. Sì, sembra che sarebbe necessario un servizio per aggregare le informazioni degli utenti attivi attraverso la server farm. Preferirei non utilizzare un database per questo per evitare conflitti sul server del database. Sembra che una lista in memoria sia sufficiente. –

Problemi correlati