ASP.NET

ProfileProvider und LastActivityDate

Warum sind soviele User online?

Die in ASP.NET integrierten SQL-Membership- und Profile-Provider sind schon eine feine Sache. Sie bieten vom Start weg eine Menge Funktionalitäten, die dem Entwickler das Leben erleichtern. Vor allem der Profile-Provider ist sehr effektiv: man deklariert in der web.config ein neues Feld und kann es direkt verwenden, um die Stammdaten eines Benutzers um eigene Felder zu erweitern.

Der Membership-Provider bietet, neben der Verwaltung der Benutzer, einige Zusatzfunktionen, um den Status eines Benutzers abzufragen, wie IsOnline oder GetNumberOfUsersOnline, die sich zum Beispiel gut dafür eignen auf einer Administrationseite anzuzeigen welche User gerade angemeldet sind. Bezugspunkt für diese beiden Eigenschaften bzw. Methoden ist das Feld LastActivityDate, in dem die letzte Aktivität des Users festgehalten wird, und die Membership-Eigenschaft UserIsOnlineTimeWindow. Aus der Differenz errechnet sich, ob ein Benutzer noch online ist oder vielleicht nicht (ASP.NET ist halt zustandslos).

Problem

Beim Einsatz des Profile-Providers gibt es dabei allerdings einen Haken: sobald auf ein Profil-Feld zugegriffen wird, aktualisiert der Provider das LastActivityDate des dazugehörigen Benutzers! Das ist das Phänomen, dass vielleicht einige Admins kennen. Man lädt die User-Liste mit zusätzlichen Informationen aus dem Profil und scheinbar sind alle User gerade online...

Schuld daran ist die server-seitige Implementierung der Provider. Möchte man eine Datenbank für deren Verwendung fitmachen, so erzeugt zum Beispiel das SQL-Server-Registrierungs-Tool aspnet_regsql.exe auf der angegebenen Datenbank alle Tabellen, Views und Stored Procedures, die benötigt werden.

Unter anderem wird eine Stored Procedure namens aspnet_Profile_GetProperties aufgespielt mit folgendem Inhalt:

Diese SP wird von der Methode GetPropertyValuesFromDatabase der Klasse SQLProfileProvider aufgerufen, die dafür zuständig ist, die Daten aus der Datenbank auszulesen.

Was heisst das im Klartext: "zeig mir das Feld XY aus dem Profil und ich tue anschließend so, als wäre es der Benutzer selbst gewesen". Für meinen Geschmack etwas unsinnig, vor allem wenn man zum Beispiel den Vor- und Nachnamen eines Benutzers im Profil abgelegt hat und ihn schlicht irgendwo auf der Seite (User-Kommentare oder ähnliches) anzeigen möchte.

Lösung

Einfach die fünf Zeilen SQL-Code auskommentieren und schon wird LastActivityDate erst wieder aktualisiert, wenn der Benutzer wirklich online ist.

kick it on dotnet-kicks.de AddThis 0 wikio-Stimme(n) Trackback-Url...

Schlagworte

Keine Kommentare bislang...

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

Artikel 287

  • Datum: 24.07.2009
    Kategorie: ASP.NET
    Zugriffe: 1.922
    Kommentare: 0
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei