2012-12-28 3 views
5

Ho problemi a ottenere il codice Hub SignalR sul lato server per richiamare i metodi client JS. Il contrario funziona correttamente, quindi quando il mio cliente invia un messaggio al server viene consegnato come previsto. Sono stato abbastanza attento a evitare trappole evidenti, ma suppongo che stia ancora trascurando qualcosa. Ecco il mio codice:Metodi Client JS SignalR non richiamati

Da MessageHub.cs:

public bool SendMessage(ClientMessage message) 
{ 
    ... 
    Clients.All.addMessage("my message"); 
    ... 
} 

Javascript:

$.connection.hub.start() 
    .done(function() { 
     messageHub = $.connection.message; 

     // addMessage is never invoked. 
     messageHub.client.addMessage = function (message) { 
      alert('message added'); 
     }; 

     /* // I tried this based on some sample code but still not invoked. 
     messageHub.addMessage = function (message) { 
      alert('message added'); 
     }; 
     */ 

     // This works as expected. 
     messageHub.server.registerUser(userId); 
     ... 
    }); 

Come accennato in precedenza, non riesco a trovare le eventuali carenze evidenti con la messa a punto, ma qui sono alcuni punti potenzialmente rilevanti:

  • La connessione viene stabilita e vengono richiamati i metodi sul lato server.
  • È probabilmente irrilevante, ma ho provato a forzare diversi trasporti senza alcun cambiamento di comportamento.
  • I nomi dei metodi client non sono in conflitto con i nomi dei metodi server in alcun punto.
  • Ho anche provato a inviare messaggi a specifiche connessioni client (che in realtà è l'obiettivo, in questo caso).
  • Ho la registrazione abilitata sia sul client che sul server ma non vedo nulla di rilevante in entrambi i casi.

Quindi, visto quanto sopra, mi manca qualcosa di ovvio? In caso contrario, qual è il modo migliore per identificare il punto di errore?

P.S. Questo non è specificamente correlato alla domanda, tuttavia, per qualche ragione, Fiddler non cattura più traffico da nessuno dei miei browser, il che rende il debugging del traffico WS o HTTP un po 'impegnativo - Immagino che sia una cosa di Windows 8 ..

risposta

29

Quindi, la risposta era in realtà abbastanza semplice (anche se dall'ultima versione sono passato da 1.0.0.0-rc1 a 1.0.0.0 - ma sono abbastanza certo che questo scenario non è stato modificato in modo significativo).

Ho trovato la risposta qui: https://stackoverflow.com/a/15074002/32935 (nota, in particolare, la mia soluzione era per la prima risposta fornita - anche se il secondo mi ha aiutato a identificare la causa).

In sostanza, per coloro che non vogliono passare alla risposta originale, ho dovuto configurare i miei metodi client prima di chiamare il metodo start() contro la connessione anziché nel callback done() come stavo facendo.Ecco un esempio:

$.connection.message.client.addMessage = function (message) { 
    alert('Now it works!'); 
}; 

$.connection.hub.start() 
    .done(function() { 
     console.log('Connection established!'); 
    }); 
+0

hai salvato totalmente il mio giorno, ¡thx! – vfportero

+0

Fantastico! Grazie mille! – Oleg

+0

questo è un suggerimento molto importante !! mi hai salvato giorni :) grazie! –

-2

Quando si passa il mouse sull'oggetto Clients, vengono visualizzate tutte le funzioni definite in JS?

In ogni caso, non sono sicuro del perché il tuo modo non funzioni, ma questo è il modo in cui ho scritto il mio lato cliente, e funziona. Forse potresti provare in questo modo.

$(function() { 

    var hub = $.connection.RatesHub; 


    $.connection.hub.start().done(function() { 
     /*Logic goes here*/ 
    }); 

    $.extend(hub.client, { 
     FuncName: function (msg) { 
      /*Logic goes here*/ 
     } 
    }); 

} 

Qualsiasi funzione desideri essere riconosciuta nel server, utilizzare $ .extend.

Spero che questo aiuti.

+0

Il motivo per cui questo funziona nella situazione è dovuto al fatto che $ .extend sta terminando prima che venga richiamato il callback del metodo done. Ciò porta a una condizione di competizione che, in caso di eventi che blocchino l'esecuzione tra la chiamata start() e $ .extend (che può accadere), nessuno dei metodi sarà accessibile a SignalR. –