2017-05-24 1 views
0

Ich verwende dieses Tutorial: https://docs.microsoft.com/en-us/aspnet/signalr/overview/older-versions/tutorial-server-broadcast-with-aspnet-signalr, um eine Nachricht von Conext zu senden, die in Singleton gespeichert ist. Ich habe ein paar Probleme.SignalR Version 1.2.2 clientseitige Methode wird nicht aufgerufen, noch wird die Protokollierung der Konsole vorgenommen

Zunächst scheint es keine Probleme bei der Zuweisung des Hubs und beim Herstellen einer Verbindung von der Clientseite zu geben. Das ist mein Code:

$(function() { 
     var transactionHub = $.connection.TransactPtHub; // the generated client-side hub proxy 

     transactionHub.client.broadcastDmrUpdate = function (test) { 

      alert("Yo-Yo Ma!!" + test); 
     }; 
     console.log('test'); 
     $.connection.hub.logging = true; 
     $.connection.hub.start() 
      .done(function() { console.log('Now connected, connection ID=' + $.connection.hub.id); }) 
      .fail(function() { console.log('Could not Connect!'); }); 

     if ($.connection.hub.state === $.signalR.connectionState.disconnected) { 
      alert("connected"); 
     } 
     else { 
      alert("not connected"); 
     } 

    }); 

Meine Warnung, "verbunden" wird beim Laden der Seite angezeigt. Die Funktion in diesem Teil des Codes "transactionHub.client.broadcastDmrUpdate = function (test) {..." wird niemals von der Serverseite aufgerufen.

Das ist mein Singleton:

public class TransactPtSingleton 
{ 
    private readonly static Lazy<TransactPtSingleton> _instance = new Lazy<TransactPtSingleton>(() => new TransactPtSingleton(GlobalHost.ConnectionManager.GetHubContext<TransactPtHub>().Clients)); 

    private TransactPtSingleton(IHubConnectionContext clients) 
    { 
     Clients = clients; 
    } 

    private IHubConnectionContext Clients 
    { 
     get; 
     set; 
    } 

    public static TransactPtSingleton Instance 
    { 
     get 
     { 
      return _instance.Value; 
     } 
    } 

    public void BroadcastDmrUpdate(string dmr) 
    { 
     Clients.All.broadcastDmrUpdate(dmr); 
    } 
} 

und dies ist meine Nabe,

[HubName("TransactPtHub")] 
public class TransactPtHub : Hub 
{ 
    public void UpdateDailyTransactionTable() 
    { 

    } 
} 

Also, ich, einen Anruf nicht zurück an den Client-Funktion auf Sendung bekommen und obwohl ich Setzen Sie meine Protokollierung auf "True". Ich sehe keine Protokolle in meiner Browserkonsole. Wo fange ich an, Fehler zu beheben? Oder was mache ich falsch? Vielen Dank.

UPDATE: Ich habe meine eigene Diagnose falsch gelesen.
if ($.connection.hub.state === $.signalR.connectionState.disconnected) {

auslöst, so dass die Verbindung aus irgendeinem Grund nicht an den Start. Außerdem werden die Dateien .done und .fail nie eingegeben, und ich bekomme nie Konsolenmeldungen.

Update 2: Die SignalR.js Kämmerei durch sie etwas zu haben scheint, mit dem zu tun,

 // Check to see if start is being called prior to page load 
     // If waitForPageLoad is true we then want to re-direct function call to the window load event 
     if (!_pageLoaded && config.waitForPageLoad === true) { 
      connection._.deferredStartHandler = function() { 
       connection.start(options, callback); 
      }; 
      _pageWindow.bind("load", connection._.deferredStartHandler); 

      return deferred.promise(); 
     } 

als bei der Rückkehr deferred.promise() es lässt die SignalR.js und kommt zurück zum aufrufenden Skript in der Benutzeroberfläche.

+0

Das JS scheint in Ordnung zu sein. Können Sie einen Haltepunkt setzen und überprüfen, ob Ihre C# -Methode "BroadcastDmrUpdate" aufgerufen wird? –

+0

@FrankModica Ja, ich habe vergessen, das zu erwähnen. Ich hatte den Haltepunkt gesetzt und es trifft diese Methode und ruft auf, Clients.All.broadcastDmrUpdate (dmr); aber dann bekomme ich keine Antwort oder Aktivität von der Client-Seite. – eaglei22

+0

Und Sie haben 'RouteTable.Routes.MapHubs();'? –

Antwort

1

Ich habe es herausgefunden. So ergibt sich dies im Grunde wieder auf meine ursprüngliche Frage hier: Question, die zunächst von der Verwendung SignalR 1.2.2 mit JQuery Version stammten 3

Von meiner „Update 2“

if (!_pageLoaded && config.waitForPageLoad === true) {.... 

, die Probleme hatte, weil mit der deprecation von .load in JQuery> 3 ich brauchte .load zu ändern, um .on Stand:

Änderung Brechen: .load(), .unload() und .error() entfernt

These Methoden sind Verknüpfungen für Ereignisoperationen, hatten jedoch mehrere API-Einschränkungen. Die Ereignismethode .load() steht im Konflikt mit der Ajax-Methode .load(). Die Methode .error() konnte nicht mit window.onerror verwendet werden, da die DOM-Methode definiert ist. Wenn Sie Ereignisse mit diesen Namen anhängen müssen, verwenden Sie die .on() -Methode, z. change $ ("img"). load (fn) bis $ ("img"). on ("load", fn).

Von: JQuery Guide

Aber vermasselte ich auf und innerhalb jquery.signalR-1.2.2JS, statt zu ändern,

_pageWindow.load(function() { _pageLoaded = true; }); 

Um

_pageWindow.on("load", function() { _pageLoaded = true; }); 

ich,

_pageWindow.on(function() { _pageLoaded = true; }); 

Keine Konsole Fehler angezeigt wurden, so dass es Dinge härter gemacht. Aber die SignalR-Verbindung wird jetzt von der Client-Seite her hergestellt, und auch die SignalR-Protokollierung funktioniert jetzt.

Wenn Sie also eine ältere Version von SignalR mit einer neueren Version von JQuery verwenden, könnte dies Ihr Problem und Ihre Lösung sein.

+1

Danke für das Posten der Lösung! –

Verwandte Themen