2012-02-16 8 views
6

estoy usando signalr 0,4 en una aspx-Page,Signalr deja de hacer las devoluciones de llamada después de algunos minutos

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 se define como:

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; 
    } 
    ...... 
} 

cuando abro la página y de inmediato haga clic en Button1
llama al concentrador que a su vez llama a ShowInfo-función en la página.
Con Firebug puedo ver que el señalizador está utilizando el sondeo largo para la comunicación. Así que todo funciona como se esperaba.

Pero cuando luego esperar un par de minutos
veo que

  • FooHub se destruye
  • desconexión se denomina en el Hub,

sin embargo en la página no existe nueva conexión
Firebug muestra que el anterior todavía se está ejecutando
y cuando hago clic en el botón -

  • FooFunction se llama (veo una nueva conexión en Firebug)
  • FooHub se crea
  • FooFunction se ejecuta en el cubo (hay una línea en el registro)
  • pero ShowInfo no se ejecuta

¿Esto es un error en SignalR o tengo que hacer algo más para obtener la llamada ShowInfo-call?

Update (Respuesta posible):

Se utilizaba un siempre-Frame y no a largo votación.

Además, el problema parece ocurrir principalmente cuando se usa internet móvil (usb-stick) y Firefox.

Cambiar el transporte a Long-Polling parece solucionar este problema.

Respuesta

1

Menciona cambiar a sondeo largo en lugar de utilizar un marco para siempre pero no dice cómo hacerlo. Puede especificar qué transportes probar al iniciar la conexión.

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

Ver https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client para más opciones.

Cuestiones relacionadas