2017-10-12 1 views
2

Warum wickeln meine SignalR Callback (von .NET C# serverseitigen Hub zu JavaScript Client-Seite) in einem $(document).ready Handler oder über seine Kurzschrift $(function() macht C# Hub -

Server-Seite:

public class AppointmentHub : Hub 
{ 
    public void RefreshSchedulers(string ownerConnectionId, string userId) 
    { 
     Clients.User(userId).refreshScheduler(ownerConnectionId); 
    } 
} 

Client-seitiges - JavaScript-Hub dieser spezielle Callback (die Handhabung von startdone und getrennt arbeiten, unabhängig davon gewickelt wird oder nicht ...) nicht ausgelöst Proxy + Rückruf:

[...] 

function getSchedulerInstance() { 
    return $('#scheduler').scheduler('instance'); 
} 

$(function() { 

     // If I move this handler below out of the jQuery document ready ($(function()) ... it works... why? 
     $.connection.appointmentHub.client.refreshScheduler = function(ownerConnectionId) { 
      if (getAppointmentHubConnectionId() !== ownerConnectionId) { 
       getSchedulerInstance().repaint(); 
      } 
     }; 

     $.connection.appointmentHub.connection.disconnected(function() { 
      setTimeout(function() { 
       $.connection.appointmentHub.connection.start(); 
       }, 
       500); 
     }); 

     $.connection.appointmentHub.connection.logging = true; 

     $.connection.appointmentHub.connection.start().done(function() { 
     }); 

}); 

function getAppointmentHubConnectionId() { 
    return $.connection.appointmentHub.connection.id; 
} 

function refreshScheduler() { 
    $.connection.appointmentHub.server.refreshSchedulers(getAppointmentHubConnectionId(), '@User.Identity.GetUserId()'); 
} 

[...] 

// Stuff below works 
function onAppointmentDeleted(e) { 
    ui.notify("Appointment deleted.", "success", 600); 
    refreshScheduler(); 
} 

function onAppointmentUpdated(e) { 
    refreshScheduler(); 
} 

function onAppointmentAdded(e) { 
    refreshScheduler(); 
} 

Kann nicht wirklich herausfinden, ich im debug-Modus überprüft der Hub ruft die refreshScheduler so alles sollte in Ordnung sein.

[EDIT]
Hinzugefügt einige Protokolle: $.connection.appointmentHub.connection.logging = true;

Client 1 (Google Chrome)

[18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: webSockets transport starting. 
jquery.signalR-2.2.2.min.js:9 [18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:52539/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=83lZVSflIHfvK0aJmXokuuQ9lC5%2F4WV6wtzkGcWKXBLrVPhQWC41mduPmu%2FMs3XM%2BezlduQ%2FKoSodH9HouPXECFS69bvKe770QV8iJbFusZPIgxLbFsLNOT8cWDsuV30hUE5QoFhjqBWto7%2BUAYnww%3D%3D&connectionData=%5B%7B%22name%22%3A%22userhub%22%7D%5D&tid=7'. 
jquery.signalR-2.2.2.min.js:9 [18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: Websocket opened. 
jquery.signalR-2.2.2.min.js:9 [18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: webSockets transport connected. Initiating start request. 
jquery.signalR-2.2.2.min.js:9 [18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state. 
jquery.signalR-2.2.2.min.js:9 [18:55:20 GMT-0400 (Eastern Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000 
jquery.signalR-2.2.2.min.js:9 [18:55:53 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking appointmenthub.RefreshSchedulers 
jquery.signalR-2.2.2.min.js:9 [18:55:53 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked appointmenthub.RefreshSchedulers 
jquery.signalR-2.2.2.min.js:9 [18:56:03 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking appointmenthub.RefreshSchedulers 
jquery.signalR-2.2.2.min.js:9 [18:56:03 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked appointmenthub.RefreshSchedulers 

Client 2 (11 Internet Explorer)

[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'appointmenthub'. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'userhub'. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22appointmenthub%22%7D%2C%7B%22name%22%3A%22userhub%22%7D%5D'. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: webSockets transport starting. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:52539/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=rWeJC23FIMc%2FXJcoF4kw3DNAJIDLk6tZXgKAMe2qWo6jq3TWwwDm0FqgWq%2F7CE3VGer%2FPVKi7hYOqryGcMVvTE1%2BGuBdNhYn76X1u1rw5p3AHuFOn%2BxPFPca0%2FDnYIcV3P5bxQUDZG1IqZL6MGw12w%3D%3D&connectionData=%5B%7B%22name%22%3A%22appointmenthub%22%7D%2C%7B%22name%22%3A%22userhub%22%7D%5D&tid=4'. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Websocket opened. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: webSockets transport connected. Initiating start request. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state. 
[18:55:34 GMT-0400 (Eastern Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000 
[18:55:53 GMT-0400 (Eastern Daylight Time)] SignalR: Triggering client hub event 'refreshScheduler' on hub 'AppointmentHub'. 
[18:55:57 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking appointmenthub.RefreshSchedulers 
[18:55:57 GMT-0400 (Eastern Daylight Time)] SignalR: Triggering client hub event 'refreshScheduler' on hub 'AppointmentHub'. 
[18:55:57 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked appointmenthub.RefreshSchedulers 
[18:55:59 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking appointmenthub.RefreshSchedulers 
[18:55:59 GMT-0400 (Eastern Daylight Time)] SignalR: Triggering client hub event 'refreshScheduler' on hub 'AppointmentHub'. 
[18:55:59 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked appointmenthub.RefreshSchedulers 
[18:56:01 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking appointmenthub.RefreshSchedulers 
[18:56:01 GMT-0400 (Eastern Daylight Time)] SignalR: Triggering client hub event 'refreshScheduler' on hub 'AppointmentHub'. 
[18:56:01 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked appointmenthub.RefreshSchedulers 
[18:56:03 GMT-0400 (Eastern Daylight Time)] SignalR: Triggering client hub event 'refreshScheduler' on hub 'AppointmentHub'. 

Aus irgendwelchen Gründen funktioniert es von Chrome zu IE11, aber nicht umgekehrt ... Ich glaube nicht, dass es mit dem Durchsuchen zu tun hat Ich habe versucht, eine andere Registerkarte in IE zu öffnen und auch mit Opera zu verbinden, aber es ist immer noch die erste Instanz von Chrome zu der ersten Instanz IE11, die funktioniert ... die Handler aus dem Ready-Fix ​​dieses Verhalten zu bekommen ... immer noch nicht Ich verstehe wirklich, was vor sich geht.

+0

Versuchen Sie, den refreshScheduler aufzurufen, bevor die Seite vollständig in das DOM geparst wurde? Da die Definition des refreshSchedulers im Dokument ready erstellt wird, existiert sie erst nach diesem Punkt und diese Logik wird ausgeführt. Oder sagst du, dass es auf diese Weise richtig funktioniert, aber etwas darin Fehler? – Taplar

+0

@Taplar Der Aufruf wird nur ausgeführt, nachdem die Seite vollständig geladen wurde. – Youna

+0

Also, was genau ist der Fehler, den Sie in Ihrer Konsole sehen? – Taplar

Antwort

0

Sie müssen den Handler registrieren, bevor Sie die Verbindung starten. Die documentation enthält weitere Details.

+0

Ich weiß, dass das in meinem Code der Fall war, werde meinen ersten Beitrag aktualisieren. Es funktionierte immer noch nicht von einem bestimmten Browser zu einem anderen – Youna

Verwandte Themen