2011-01-02 11 views
1

Ich erstelle eine sehr einfache Chat-Anwendung. Es hat eine ASP.NET-Webseite als Front-End und einen WCF-Dienst als Back-End zum Speichern der Nachrichten in einer Datenbank.Kontinuierliche Aktualisierung von Chat-Nachrichten

Alles funktioniert gut außer einer Sache; Wenn Browser A eine Chat-Nachricht eingibt, möchte ich, dass Browser B die Nachricht so bald wie möglich sieht (ja, ich weiß, das ist der Zweck eines Chats).

Was ich bisher getan habe, ist ein Trigger-Setup innerhalb der Update, wie folgt aus:

<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="chatTimer" EventName="Tick" /> 
</Triggers> 

, die einen Timer verwendet:

<asp:Timer ID="chatTimer" runat="server" OnTick="chatTimer_Tick" Interval="1000" /> 

Ist dies der beste Ansatz, oder gibt es ein besserer und doch einfacher Weg, um Nachrichten zu aktualisieren. Ein Nachteil dieser Lösung besteht darin, dass das Textfeld, das zum Eingeben von Chatnachrichten verwendet wird, jedes Mal, wenn das Tick-Ereignis ausgeführt wird, den Fokus verliert.

Jede Rückmeldung oder Beratung bezüglich der Aktualisierung von Nachrichten ist willkommen.

Vielen Dank!

+0

Haben Sie darüber nachgedacht, dies in Silverlight zu tun? Sie können möglicherweise Sockets verwenden, um Updates an Clients zu senden, anstatt Updates jede Sekunde auszuführen. – Juliet

+0

Im Moment, nein, habe ich nicht. Zur gleichen Zeit klingt Ihr Vorschlag wirklich nett. Das ist genau das, was ich gerne machen würde. – Daniel

Antwort

2

Da das HTTP-Protokoll Server Push nicht unterstützt, müssen Sie den Server auf Änderungen abfragen. Es gibt verschiedene Möglichkeiten, dies zu tun, aber sie sind alle ähnlich zu dem, was Sie tun.

Sie können das Update Ihres Update-Panels optional vornehmen, indem Sie UpdateMode="Conditional" einstellen, so dass es bei jedem Timer-Tick nicht aktualisiert (und Fokus verlieren) wird. Es wird nur aktualisiert, wenn Sie die Update-Methode auf der Serverseite aufgerufen haben, um sie auszulösen.

+0

Danke, Art der Antwort, die ich gesucht habe. Das heißt, Server-Push ist in ASP.NET nicht verfügbar. – Daniel

+0

@Daniel: Ja, aber das HTTP-Protokoll ist die Einschränkungen, nicht das ASP.NET-Framework. :) – Guffa

2

Comet ist eine Technik, die für diese Art von Szenario verwendet wird. Obwohl ich nicht sagen würde, dass es einfach ist.

Grundsätzlich würde der Client eine langlebige Verbindung offen für den Server halten, dann kann der Server Daten an den Browser senden.

Diese Frage bezieht: Comet implementation for ASP.NET?

1

Wenn Sie WCF verwenden Sie einen CallbackContract implementieren könnte, dass der Server aufruft, wenn eine Nachricht von anderen Kunden ankommen.

+0

Aber der Callback-Vertrag wäre ziemlich schwer auf der Client-Seite zu implementieren, oder? –

+0

Warum sagst du, dass es schwer ist? –

+0

Das können Sie nur mit NetTcpBinding und NetNamedPipeBinding tun. Ich glaube nicht, dass ein Browser das unterstützt. Er verwendet WCF nicht zur Kommunikation mit dem Client (Browser). – Iain

Verwandte Themen