Immer wieder wird in unterschiedlichen Foren gefragt wie man die aktuelle Zeit des Webservers auf einer Webseite anzeigen kann.
Dies ist mit reinem ASP.NET nicht möglich, es sei denn, man bringt den Benutzer der Webseite dazu, im Sekundentakt (oder schneller) die F5 Taste zu drücken 
Wie kann das Problem also gelöst werden? Vielleicht mit JavaScript? Nein, denn JavaScript wird auf der Client-Seite ausgeführt, das bedeutet, es wird die Uhrzeit des Client Rechners angezeigt und ob die immer stimmt, lasse ich mal offen. Ganz ohne JavaScript geht es trotzdem nicht.
Im folgenden Beispiel wird ein JavaScript in regelmäßigen Abständen die aktuelle Uhrzeit vom Server abfragen und das Ergebnis in ein Textfeld schreiben.
Die aktuelle Uhrzeit liefert ein Webservice der sich auf dem Server läuft.
Als Proxy zwischen JavaScript und Webservice dient ein ASP.NET AJAX ScriptManager:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="WebServiceServerTime.asmx" />
</Services>
</asp:ScriptManager>
Im Scriptmanager wird der Webservice referenziert, der die Zeit als String zurückgibt.
Der Webservice liegt im gleichen Verzeichnis wie die Webseite, die die Zeit ausgeben soll. Der Webservice ist sehr übersichtlich:
using System;
using System.Web.Script.Services;
using System.Web.Services;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebServiceServerTime : WebService
{
[WebMethod]
public string GetTime()
{
return DateTime.Now.ToString();
}
}
Wichtig ist hierbei das Attribut [ScriptService]. Mit diesem Attribut ist der Webservice auch für JavaScript-Clients verfügbar.
Kommen wir nun zur Client Seite, wie bereits erwähnt, geht es nicht ohne JavaScript:
<script language="javascript" type="text/javascript">
function CallTimeservice()
{
ret = WebServiceServerTime.GetTime(onGetTime);
setTimeout('CallTimeservice()', 500);
}
function onGetTime (arg)
{
var textfeld = document.getElementById('input1');
textfeld.value = arg;
}
</script>Das dazugehörige Textfeld:
<input id="input1" readonly="readonly" type="text" />
Das Script beinhaltet eine Methode und einen Ereignishandler.
Die Methode CallTimeservice () wird alle 500 ms neu aufgerufen.
Die aktuelle Zeit die vom Webserver übertragen wurde, wird durch den Handler onGetTime() in das Textfeld geschrieben.
Leider gibt es in JavaScript keine Sleep() oder Wait() Methode desshalb muss die SetTimeout() Methode verwendet werden.
Warum habe ich 500 ms gewählt?
Das Nyquist-Shannon-Abtasttheorem besagt, dass die Abtastfrequenz mindestens doppelt so hoch sein muss wie das Ursprungssignal um Informationsverlust zu vermeiden.
Das bedeutet im Klartext: Die Zeit die auf dem Server mit DatTime.Now.ToString() abgefragt wird, ändert sich mit 1Hz, also muss die Zeit mit 2 Hz (f=1/s --> 1/2 Hz = 0,5s) abgefragt werden, damit der User einen gleichmäßigen Timer ticken sieht. Der Wert darf natürlich auch kleiner als 500ms sein, dies wäre genauer, erhöht aber die Netzwerklast des Servers zusätzlich.
Zum Erstellen des Projektes sollte man zuerst ASP.Net AJAX installieren, dann kann im Visual Studio eine „Ajax Enabled Webseite“ erstellt werden.
Diese Vorlage hat den Vorteil, dass die Web.config für Ajax vorbereitet ist und dass sich der Scriptmanager in jeder .aspx Datei befindet.
Mit dieser kleinen Anleitung sollte es nicht schwer fallen einen Countdown oder ähnliches zu realisieren.
Vielleicht sollte Ebay auch mal drüber nachdenken.
So ein Auktionscountdown wäre sicher sinnvoll.