Seit kurzem gibt es bei mir im Blog oben Rechts den Hinweis wie viele Besucher zur Zeit bei mir Online sind. Das Ding ist aber sehr einfach gestrickt, sollte aber relativ genau sein. Wer mehr Hintergrundwissen haben möchte kann sich bei Klaus Bock dieses Posting ansehen.
Klaus geht noch weiter. Er registriert ein Java Script auf dem Client das beim schliessen des Browsers noch eine Seite aufruft die nichts anderes macht als die Session auf dem Server zu beenden. Aber spätestens nach 20 Minuten wird die Session auf dem Server so oder so mit Session_End beendet.
Die Implementation in BlogEngine.NET, kurz BE, läuft in etwa wie folgt ab.
Bei BE sind die Sessions standardmässig ausgeschaltet. Ich habe sie einfach in der Web.config wieder eingeschaltet.
<sessionState mode="InProc" cookieName=".geniali.ch"/>
Als nächstes muss noch bemerkt werden wann eine neue Session startet und wann eine Session beendet wird. Dazu gibt es in ASP.NET zwei Events die man in der Datei global.asax implementieren muss. Bei BE sind die Zwei noch nicht drin.
void Session_Start(object sender, EventArgs e)
{
// User-Zähler erhöhen.
Application.Lock();
Application["Viewers"] = (int)Application["Viewers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
// User-Zähler verringern.
Application.Lock();
if((int)Application["Viewers"] > 0)
{
Application["Viewers"] = (int)Application["Viewers"] - 1;
}
Application.UnLock();
}
Das Application["Viewers"] Objekt muss aber zuerst noch initialisiert werden. Zudem muss auch sichergestellt sein das beim Start des Webs diese Variable auch wieder auf 0 gestellt wird. Dies macht man im Event Application_Start.
void Application_Start(object sender, EventArgs e)
{
// Schlüssel Viewers in der Anwendung erzeugen
Application["Viewers"] = 0;
...
Danach muss nur noch sicher gestellt werden das die “Viewers” auch angezeigt werden. Dazu erstellt man ein neues UserControl. Ich habe das UserControl unter meinem Theme im Ordner Controls abgelegt.
UserOnline.ascx
<%@ Control Language="C#"
AutoEventWireup="true"
CodeFile="UserOnline.ascx.cs"
Inherits="themes_GENiALi_Controls_UserOnline" %>
<asp:Literal ID="litUsers" runat="server"></asp:Literal>
UserOnline.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class themes_GENiALi_Controls_UserOnline
: System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
litUsers.Text = Application["Viewers"].ToString()
+ " Besucher online";
}
}
Das UserControl kann man einfach auf die site.master des Theme ziehen und dort platzieren. Mit CSS kann die Anzeige noch formatiert und ausgerichtet werden.
Unter dem Strich sollte es in etwa so aussehen. :-)
