2013-07-23 3 views
9

Sviluppo un'applicazione asp.net mvc con il sistema di messaggistica in tempo reale basato su SignalR (jquery.signalR-2.0.0-beta2.js). Il problema è che tutte le viste parziali non possono essere caricate dopo l'avvio della connessione SignalR. In questo caso tutte le richieste Ajax dopo lo $ .connection.hub.start ({transport: 'longPolling'}). Done (function() { applicationHub.server.connectUser(); }) rimane in sospeso. È possibile rendere questa richiesta asincrona o si tratta di un bug nel SignalR? Grazie per l'aiuto!Connessione SignalR blocco altre richieste ajax

SignalR chiamata:

<script type="text/javascript"> 

    $(document).ajaxStop(function() { 
     var applicationHub = $.connection.applicationHub; 

     if ($.connection.hub && $.connection.hub.state == $.signalR.connectionState.disconnected) { 

      registerConversationClientMethods(applicationHub); 

      $.connection.hub.start({ transport: 'longPolling'}).done(function() { 
       applicationHub.server.connectUser(); 
      }) 
      .fail(function() { 

      }); 
     } 
    }); 
</script> 

Ajax chiamata che rende una vista parziale:

LoadActivities funzione (id, tipo, contenitore, azione, loaderpath) {

var url = action + '/?id=' + id + '&type=' + type; 
var targetDiv = container; 
var ajaxLoading = "<img id='ajax-loader' src='" + loaderpath + "' height='6' width='50' style='margin:5px;'>"; 

$(targetDiv).html("<div align='center'>" + ajaxLoading + "</div>"); 

$.get(url, null, function (result) { 
    $(targetDiv).html(result); 
}); 

+0

stai usando iOS ? È questo il problema? https://github.com/SignalR/SignalR/issues/1406 –

+0

no sto usando Windows 7. Il tuo problema ha un comportamento simile ma non è quello che sto capendo. Tutte le richieste asincrone asincrone rimangono in sospeso dopo l'avvio della richiesta ajax del SignalR (poll? Transport = longPolling & connectionToken = 1Kpx% 2B72 ...) che ha anche uno stato in sospeso (come dovrebbe essere). – Alliancer

+0

Windows 7 + IIS completo (non iis express) ha un limite di connessione simultaneo di 10. Stai usando iis completo? – davidfowl

risposta

1

Prendendo la risposta di @ bjornhol un po 'oltre, lo stesso problema di tutte le richieste SignalR (che stavano caricando più AJAX) stava accadendo anche a me. Ho pensato che fosse jQuery, ma in realtà è lo stato della sessione. Per quel controller, se puoi impostare SessionStateBehaviour su ReadOnly o Disabled vedrai che le richieste passano contemporaneamente. Si prega di vedere questo link anche http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ Spero che questo aiuti.

5

Ho un'altra spiegazione per cosa potrebbe aver causato il problema.

Poiché la domanda è stata posta nel 2013, suppongo che l'autore abbia già trovato la soluzione al suo problema. Ma dal momento che mi ci sono volute diverse ore per scavare nel mio, credo che sia mio dovere condividere la mia esperienza.

Panoramica architettura: Applicazione Asp.Net SPA con AngularJS sul lato client e WebApi 2.0 e SignalR 2.1 sul lato server.

Sintomi di problemi: l'applicazione si avvia e funziona normalmente ma dopo un po 'tutte le richieste (SignalR e WebApi) rimangono bloccate. Per "bloccato" intendo che le richieste WebApi vengono fatte sul client ma i metodi del controller non vengono mai richiamati. Il primo a essere congelato è sempre la richiesta SignalR.

Network Monitor

Dopo aver fatto qualche ricerca ho trovato il motivo più probabile per questi sintomi. Questo era il problema "Blocco stato sessione" descritto in dettaglio in this post by John Culviner.

Dal momento che la mia domanda non stava usando le sessioni ho semplicemente passato a modalità di sola lettura a livello di applicazione:

protected void Application_Start() 
{ 
    // Some extra initialization here 
    Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly); 
} 

Questo non ha aiutato.

ho continuato la mia ricerca e credo che da quel momento ho letto ogni articolo o bug report con parole chiave SignalR, collegamento, bloccato, congelare, appendere. Nulla sembrava essere correlato al mio caso.Quindi, invece di cercare quale potrebbe essere il problema con la tecnologia in uso, ho iniziato ad analizzare cosa potrebbe essere sbagliato con il mio codice. Ed eccolo lì.

Il mio problema ha una buona descrizione in questo article by Shaun. Ecco la panoramica. Nel mondo MVC standard SignalR gestisce la propria connessione. Si disconnetterà automaticamente quando ci si sposta su un'altra pagina. Quindi potresti semplicemente creare la connessione e non pensarci più. Purtroppo questo non è vero per le applicazioni SPA/AngularJS. La connessione SignalR non saprà mai che la pagina all'interno di SPA è stata modificata e non si disconnetterà mai da sola. Quando si ritorna alla pagina, verrà creata una nuova connessione SignalR. Nelle mie osservazioni è necessario farlo circa 10 volte per rendere la pipa che serve le richieste bloccate.

Quindi, tutto quello che dovete fare qui è la creazione di una funzione di arresto per il collegamento SignalR e chiamando manualmente prima di cambiare pagina all'interno SPA:

stop: function() { 
    if (connection && connection.state && connection.state !== 4 /* disconnected */) { 
     connection.stop(); 
    } 
}, 

In regolatore:

$scope.$on('$destroy', function() { 
    clientPushHubProxy.stop(); 
}); 
+0

Sto affrontando lo stesso problema, ma non sto usando AngularJS (sto usando ASp.net MVC). Puoi suggerire come interrompere la connessione usando jquery. –