2017-09-29 1 views
1

Es tut mir leid, dass Sie möglicherweise einen doppelten Thread erstellen, aber ich kann meine Webanwendung einfach nicht dazu bringen, das zu tun, was ich brauche, indem ich die anderen Beispiele befolge.Push-Daten zum Client mit SignalR

Mein Ziel ist es eine der folgenden Funktionen ausführen:

OPTION 1 - IDEAL LÖSUNG
Daten Fetch aus einer Datenbank und aktualisieren die Benutzeroberfläche auf einer Webseite nur, wenn Änderungen an den Daten vorgenommen werden angezeigt auf der Webseite. Wenn ein Benutzer beispielsweise ein Serviceticket anzeigt, möchte ich die Benutzeroberfläche auf dieser Seite nur aktualisieren, wenn dieses Ticket geändert wird.

OPTION 2 - akzeptable Lösung
Daten Fetch aus einer Datenbank alle x Sekunden und diese Daten verwenden, die Benutzeroberfläche auf einer Web-Seite zu aktualisieren.

Meine aktuelle Implementierung von Option 2 ist unten. Es geht um eine asynchrone HTTP-Anforderung alle 60 Sekunden sendet die Daten zu holen:

// start checking for new messages every 60 seconds 
setInterval(function() { 
    $.ajax({ 
     async: true, 
     type: "POST", 
     contentType: "application/json; charset=utf-8;", 
     url: "/AJAX_Handlers/CheckForNewMessages.ashx", 
     dataType: "json", 
     success: function (Result) { 
      var new_message_received = Result[0]["NewMessageReceived"]; 

      if (new_message_received) { 
       $("#DIVMessageReminder").html("<strong>You have " + num_new_messages + " new message(s).</strong>"); 
       $("#DIVMessageReminder").show(); 
      } 
      else { 
       $("#DIVMessageReminder").hide(); 
      } 
     } 
    }); 
}, 60000); 

Anstatt eine HTTP-Anforderung alle 60 Sekunden zu senden, würde Ich mag SignalR verwenden alle 60 Sekunden, dass die Daten an den Client zu schieben.

Als einfaches Beispiel, ich habe folgenden Hub mit einer Methode erstellt die aktuelle Uhrzeit auf dem Server zu erhalten:

Imports Microsoft.AspNet.SignalR 

Public Class ServerTimeHub 
    Inherits Hub 

    Public Sub GetServerTime() 
     Dim current_time As String = Now.ToString() 
     Clients.All.updateTime(current_time) 
    End Sub 

End Class 

und ein basisches Textbox:

<input id="TXTLongPollingTest" type="text" class="form-control" /> 

Und meinen client- Seitencode:

Zuerst habe ich versucht, es zu bekommen, um die Serverzeit nur einmal zu holen. Mein Code wird erfolgreich eine Verbindung mit dem Hub herstellen, aber dann wird der Fehler "Uncaught TypeError: hub.getServerTime ist keine Funktion" ausgegeben. Das ist das erste Problem, das ich nicht überwinden konnte.

Das zweite Problem ist: Wie kann ich den Hub erhalten, um die aktuelle Uhrzeit in regelmäßigen Abständen, z. B. alle 1 Sekunde, an den Client zu senden?

Antwort

0

Hier ist was ich getan habe, um etwas Ähnliches zu erreichen. Im Wesentlichen Abrufen von Daten aus der Datenbank und Senden an Clients alle 30 Sekunden.

In meinem global.asax.cs ich das haben, um sicherzustellen, wenn meine Website gestartet hat/neu gestartet es mein Repeater Auftakt:

protected void Application_Start(object sender, EventArgs e) 
{ 
    GetTeamData.TeamDataRepeater(); 
} 

In meinem GetTeamData.cs Ich habe einen Timer, der gesetzt ist alle 30 Sekunden

public class GetTeamData 
    {  
    static Timer TeamDataTimer = new Timer(); 

    public static void TeamDataRepeater() 
    { 
      TeamDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent_TeamDataBroadcaster); 
      TeamDataTimer.Interval = 30000; //30 Seconds 
      TeamDataTimer.Start(); 
    } 

    public static void OnTimedEvent_TeamDataBroadcaster(Object sender, ElapsedEventArgs e) 
    { 
      updateFirstRow(); 
    } 

    public static void updateFirstRow() 
    { 
      IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MsgHub>(); 
      hubContext.Clients.All.pushMyData(mydata1, mydata2, mydata3); 
    }   

    } 

Mein Java-Skript für den Kunden zu laufen hat:

//I have already started my connection 

$(function() { 
    var chat = $.connection.msgHub; 
    chat.client.pushMyData = function (mydata1, mydata2, mydata3) 
    { 
    //Do something with the returned data now 
    } 
}); 

Hinweis tha t Ich habe einige Dinge wie die Verwendung von try/catch entfernt, um Ihnen ein Beispiel zu geben.

Hoffe, dass hilft.

+0

Auch wenn dies den anderen Beispielen sehr ähnlich zu sein scheint, hat dies für mich funktioniert. Vielen Dank für deine Hilfe! Ich möchte immer noch wissen, ob jemand eine Lösung hat, um neue Daten NUR zu holen, wenn die fraglichen Daten geändert worden sind. – freegem

Verwandte Themen