Registra attività utente sull'applicazione ASP.NET MVC
-
10-07-2019 - |
Domanda
Esiste una buona strategia per registrare l'attività dell'utente su un'app ASP MVC? (ActionFilters / HTTPModules).
Qualcosa come l'attività dell'ultimo utente (proprio come StackOverflow " visto 23 minuti fa "), e anche quali pagine e controller sono stati usati, e spingendo ancora di più su quali pulsanti o link sono stati cliccati.
Ho ELMAH installato ma per quanto ne so è solo per la registrazione degli errori.
PD: Google Analytics non è un'opzione.
Soluzione
Potresti provare a utilizzare un aspetto PostSharp per eseguire la registrazione per te, la sua funzionalità multi-cast potrebbe tornare utile per qualcosa del genere. Se non è un'opzione, un modulo sarebbe probabilmente il più facile da implementare (supponendo che tu possa ottenere le informazioni utente richieste in quel punto della pipeline).
Altri suggerimenti
Avviso: è stato scritto nel 2009 per MVC .NET RC1 e potrebbe non essere più sintatticamente corretto.
Azione Gli attributi di filtro sono perfetti per questo, basta fare una chiamata a [YourAttributeName]
nella parte superiore del controller (o se si dispone di un controller dell'applicazione da cui ereditano gli altri controller, è necessario solo una volta nella tua applicazione).
Ad esempio:
namespace the_name_space
{
[Log]
public class ApplicationController : Controller
{
Da questo punto in poi questo attributo verrà chiamato prima che ogni azione venga eseguita nei tuoi controller, puoi anche specificarlo su un'azione chiamando [Log]
appena prima nel stessa moda.
Per ottenere la funzionalità di registrazione richiesta, è molto probabile che si desideri sostituire OnResultExecuting
e OnResultExecuted
, entrambi abbastanza chiari.
Ad esempio:
public class LogAttribute : ActionFilterAttribute
{
protected DateTime start_time;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
start_time = DateTime.Now;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
RouteData route_data = filterContext.RouteData;
TimeSpan duration = (DateTime.Now - start_time);
string controller = (string)route_data.Values["controller"];
string action = (string)route_data.Values["action"];
DateTime created_at = DateTime.Now;
//Save all your required values, including user id and whatnot here.
//The duration variable will allow you to see expensive page loads on the controller, this can be useful when clients complain about something being slow.
}
}
Mi sono appena imbattuto in questi 2 post di Rion Williams che descrivono un modo molto semplice per farlo:
Implementazione di audit trail utilizzando ASP.NET MVC ActionFilters
Creazione di percorsi di controllo avanzati mediante ActionFilters in ASP.NET MVC
Il post avanzato è davvero eccezionale in quanto è possibile archiviare i dati della richiesta e filtrare ulteriormente tali dati.
Lo implementerò subito nella mia app.
L'idea di @ Rory è eccellente. PostSharp è proprio quello che ti serve per questo, potresti prendere in considerazione l'idea di accoppiarlo con ASP.net Monitoraggio sanitario