2012-02-16 15 views
6

Sto usando signalr 0,4 su un aspx-pagina,Signalr si ferma a fare le richiamate dopo qualche minuto

var hub = $.connection.FooHub; 

hub.disconnected(function() {     
      log("Server has disconnected"); 
     }); 

hub.ShowInfo = function (Info) { .... } 

$("#Button1").click(function() { 
      hub.FooFunction('foo'); 
     }); 

$.connection.hub.start(); 

The Hub è definito come:

public class FooHub : Hub, IDisconnect 
{  
    ~FooHub() 
    { 
     log.Debug("FooHub Destroy"); 
    } 
    public FooHub() 
    { 
     log.Debug("FooHub Startup"); 
    }  
    public bool FooFunction(string stuff) 
    { 
     log.Debug("Hub FooFunction"); 
     Clients.ShowInfo(someInfo); 
     return true; 
    } 
    public Task Disconnect() 
    { 
     // Query the database to find the user by it's client id etc. etc. 
     MyController.Disconnect(Context.ConnectionId); 
     log.Debug("Hub Disconnnect " + Context.ConnectionId); 
     return null; 
    } 
    ...... 
} 

quando apro la pagina e subito fare clic su Button1
chiama l'hub che a sua volta chiama la funzione ShowInfo sulla pagina.
Con Firebug posso vedere che signalr sta usando il polling lungo per la comunicazione. Quindi tutto funziona come previsto.

Ma quando poi attendere un paio di minuti
vedo che

  • FooHub viene distrutto
  • Disconnect viene chiamato nel Hub,

comunque sulla pagina non esiste nuova connessione
Firebug mostra il vecchio ancora in esecuzione
e quando poi clicco sul pulsante -

  • FooFunction si chiama (vedo una nuova connessione in Firebug)
  • FooHub è creato
  • FooFunction viene eseguito nel Hub (c'è una linea nel registro)
  • ma ShowInfo non viene eseguito

Si tratta di un errore in SignalR o devo fare qualcos'altro per ottenere la chiamata ShowInfo?

Update (Possibile risposta):

Si stava usando un sempre-Frame e non a lungo polling.

Inoltre, il problema sembra verificarsi soprattutto quando si utilizza Internet mobile (chiavetta USB) e Firefox.

La modifica del trasporto su polling prolungato sembra risolvere questo problema.

risposta

1

Si dice di passare al polling lungo invece di usare un frame per sempre ma non si dice come farlo. È possibile specificare quali trasporti provare quando si avvia la connessione.

connection.start({ transport: ['longPolling','webSockets'] }); 

Vedere https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client per ulteriori opzioni.

Problemi correlati