Risoluzione dei problemi di SignalR (SignalR 1.x)

di Patrick Fletcher

Avviso

Questa documentazione non è per la versione più recente di SignalR. Esaminare ASP.NET Core SignalR.

Questo documento descrive i problemi comuni relativi alla risoluzione dei problemi relativi a SignalR.

Questo documento contiene le sezioni seguenti.

La chiamata di metodi tra il client e il server non riesce in modo automatico

In questa sezione vengono descritte le possibili cause di una chiamata di metodo tra client e server senza un messaggio di errore significativo. In un'applicazione SignalR il server non contiene informazioni sui metodi implementati dal client; quando il server richiama un metodo client, i dati del metodo e dei parametri vengono inviati al client e il metodo viene eseguito solo se esiste nel formato specificato dal server. Se nel client non viene trovato alcun metodo corrispondente, non viene generato alcun messaggio di errore nel server.

Per esaminare ulteriormente i metodi client non chiamati, è possibile attivare la registrazione prima di chiamare il metodo start nell'hub per visualizzare le chiamate provenienti dal server. Per abilitare la registrazione in un'applicazione JavaScript, vedere Come abilitare la registrazione lato client (versione client JavaScript). Per abilitare la registrazione in un'applicazione client .NET, vedere Come abilitare la registrazione lato client (versione client.NET).

Metodo errato, firma del metodo non corretto o nome dell'hub non corretto

Se il nome o la firma di un metodo denominato non corrisponde esattamente a un metodo appropriato nel client, la chiamata avrà esito negativo. Verificare che il nome del metodo chiamato dal server corrisponda al nome del metodo nel client. SignalR crea anche il proxy dell'hub usando metodi camel cased, come appropriato in JavaScript, in modo che un metodo chiamato SendMessage sul server venga chiamato sendMessage nel proxy client. Se si usa l'attributo HubName nel codice lato server, verificare che il nome usato corrisponda al nome usato per creare l'hub nel client. Se non si usa l'attributo, verificare che il nome dell'hub HubName in un client JavaScript sia camel-cased, ad esempio chatHub anziché ChatHub.

Nome del metodo duplicato nel client

Verificare che non si disponga di un metodo duplicato nel client che differisce solo in base al caso. Se l'applicazione client ha un metodo denominato sendMessage, verificare che non sia presente anche un metodo chiamato SendMessage .

Parser JSON mancante nel client

SignalR richiede che un parser JSON sia presente per serializzare le chiamate tra il server e il client. Se il client non dispone di un parser JSON predefinito (ad esempio Internet Explorer 7), sarà necessario includere uno nell'applicazione. È possibile scaricare il parser JSON qui.

Sintassi di Mix Hub e PersistentConnection

SignalR usa due modelli di comunicazione: Hub e PersistentConnections. La sintassi per chiamare questi due modelli di comunicazione è diversa nel codice client. Se è stato aggiunto un hub nel codice del server, verificare che tutto il codice client usi la sintassi dell'hub appropriata.

Codice client JavaScript che crea una connessione persistente in un client JavaScript

var myConnection = $.connection('/echo');

Codice client JavaScript che crea un proxy hub in un client Javascript

var myHub = $.connection.MyHub;

Codice del server C# che esegue il mapping di una route a una connessione persistente

RouteTable.Routes.MapConnection<MyConnection>("my", "/echo");

Codice del server C# che esegue il mapping di una route a un hub o a più hub se sono presenti più applicazioni

RouteTable.Routes.MapHubs();

Connessione avviata prima dell'aggiunta delle sottoscrizioni

Se la connessione dell'hub viene avviata prima che i metodi che possono essere chiamati dal server vengano aggiunti al proxy, i messaggi non verranno ricevuti. Il codice JavaScript seguente non avvierà correttamente l'hub:

Codice client JavaScript non corretto che non consente la ricezione dei messaggi dell'hub

var chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
    chat.client.broadcastMessage = function (name, message) {...};
});

Aggiungere invece le sottoscrizioni del metodo prima di chiamare Start:

Codice client JavaScript che aggiunge correttamente sottoscrizioni a un hub

var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {...};
    $.connection.hub.start().done(function () {
        ...
    });

Nome del metodo mancante nel proxy dell'hub

Verificare che il metodo definito nel server sia sottoscritto nel client. Anche se il server definisce il metodo, deve comunque essere aggiunto al proxy client. I metodi possono essere aggiunti al proxy client nei modi seguenti (Si noti che il metodo viene aggiunto al client membro dell'hub, non direttamente l'hub):

Codice client JavaScript che aggiunge metodi a un proxy hub

// Method added to proxy in JavaScript:
myHubProxy.server.method1 = function (param1, param2) {...};
//Multiple methods added to proxy in JavaScript using jQuery:
$.extend(myHubProxy.server, {
    method1: function (param1, param2) {...},
    method2: function (param3, param4) {...}
});

Metodi hub o hub non dichiarati come pubblici

Per essere visibili nel client, l'implementazione e i metodi dell'hub devono essere dichiarati come public.

Accesso all'hub da un'applicazione diversa

Gli hub SignalR possono essere accessibili solo tramite applicazioni che implementano client SignalR. SignalR non può interagire con altre librerie di comunicazione (ad esempio servizi Web SOAP o WCF). Se non è disponibile alcun client SignalR per la piattaforma di destinazione, non è possibile accedere direttamente all'endpoint del server.

Serializzazione manuale dei dati

SignalR userà automaticamente JSON per serializzare i parametri del metodo. Non è necessario eseguirlo autonomamente.

Metodo Hub remoto non eseguito nel client nella funzione OnDisconnected

Questo comportamento dipende dalla progettazione. Quando OnDisconnected viene chiamato, l'hub ha già immesso lo Disconnected stato, che non consente di chiamare altri metodi hub.

Codice del server C# che esegue correttamente il codice nell'evento OnDisconnected

public class MyHub : Hub
{
    public override Task OnDisconnected()
    {
        // Do what you want here
        return base.OnDisconnected();
    }
}

Limite di connessione raggiunto

Quando si usa la versione completa di IIS in un sistema operativo client come Windows 7, viene imposto un limite di connessione a 10. Quando si usa un sistema operativo client, usare IIS Express invece per evitare questo limite.

Connessione tra domini non configurata correttamente

Se una connessione tra domini (una connessione per cui l'URL SignalR non si trova nello stesso dominio della pagina di hosting) non è configurata correttamente, la connessione potrebbe non riuscire senza un messaggio di errore. Per informazioni su come abilitare la comunicazione tra domini, vedere Come stabilire una connessione tra domini.

Connessione con NTLM (Active Directory) non funzionante nel client .NET

Una connessione in un'applicazione client .NET che usa la sicurezza del dominio potrebbe non riuscire se la connessione non è configurata correttamente. Per usare SignalR in un ambiente di dominio, impostare la proprietà di connessione necessaria come indicato di seguito:

Codice client C# che implementa le credenziali di connessione

connection.Credentials = CredentialCache.DefaultCredentials;

Altri problemi di connessione

Questa sezione descrive le cause e le soluzioni per sintomi o messaggi di errore specifici che si verificano durante una connessione.

Errore "Start deve essere chiamato prima che i dati possano essere inviati"

Questo errore viene comunemente rilevato se il codice fa riferimento agli oggetti SignalR prima dell'avvio della connessione. Il collegamento per i gestori e il tipo che chiamerà i metodi definiti nel server deve essere aggiunto al termine della connessione. Si noti che la chiamata a Start è asincrona, quindi il codice dopo l'esecuzione della chiamata può essere eseguita prima del completamento. Il modo migliore per aggiungere gestori dopo l'avvio completo di una connessione consiste nell'inserirli in una funzione di callback passata come parametro al metodo start:

Codice client JavaScript che aggiunge correttamente gestori eventi che fanno riferimento agli oggetti SignalR

$.connection.hub.start().done(function () {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.server.newContosoChatMessage(
            $('#displayname').val(), $('#message').val());
            $('#message').val('').focus();
    });

Questo errore verrà visualizzato anche se viene interrotta una connessione mentre gli oggetti SignalR sono ancora a cui viene fatto riferimento.

Errore "301 Spostato definitivamente" o "302 Spostato temporaneamente"

Questo errore può essere visualizzato se il progetto contiene una cartella denominata SignalR, che interferirà con il proxy creato automaticamente. Per evitare questo errore, non usare una cartella chiamata SignalR nell'applicazione o disattivare la generazione automatica del proxy. Per altre informazioni, vedere Proxy generato e cosa fa per l'utente .

Errore "403 Non consentito" nel client .NET o Silverlight

Questo errore può verificarsi negli ambienti tra domini in cui la comunicazione tra domini non è abilitata correttamente. Per informazioni su come abilitare la comunicazione tra domini, vedere Come stabilire una connessione tra domini. Per stabilire una connessione tra domini in un client Silverlight, vedere Connessioni tra domini dai client Silverlight.

Errore "404 Not Found"

Esistono diverse cause per questo problema. Verificare tutte le operazioni seguenti:

  • Riferimento all'indirizzo proxy dell'hub non formattato correttamente: Questo errore viene comunemente rilevato se il riferimento all'indirizzo proxy dell'hub generato non è formattato correttamente. Verificare che il riferimento all'indirizzo dell'hub venga effettuato correttamente. Per informazioni dettagliate, vedere Come fare riferimento al proxy generato dinamicamente .
  • Aggiunta di route all'applicazione prima di aggiungere la route dell'hub: Se l'applicazione usa altre route, verificare che la prima route aggiunta sia la chiamata a MapHubs.

"Errore interno del server 500"

Si tratta di un errore molto generico che potrebbe avere un'ampia gamma di cause. I dettagli dell'errore dovrebbero essere visualizzati nel registro eventi del server oppure sono disponibili tramite il debug del server. È possibile ottenere informazioni più dettagliate sull'errore attivando errori dettagliati nel server. Per altre informazioni, vedere Come gestire gli errori nella classe Hub.

Errore "TypeError: <hubType> non definito"

Questo errore genererà se la chiamata a MapHubs non viene eseguita correttamente. Per altre informazioni, vedere Come registrare la route SignalR e configurare le opzioni signalR .

JsonSerializationException non gestito dal codice utente

Verificare che i parametri inviati ai metodi non includano tipi non serializzabili, ad esempio handle di file o connessioni di database. Se è necessario usare membri in un oggetto lato server che non si vuole inviare al client (per motivi di sicurezza o per motivi di serializzazione), usare l'attributo JSONIgnore .

Errore "Errore del protocollo: Trasporto sconosciuto"

Questo errore può verificarsi se il client non supporta i trasporti usati da SignalR. Per informazioni su quali browser possono essere usati con SignalR, vedere Transports and Fallbacks (Trasporti e fallback ).

"La generazione del proxy dell'hub JavaScript è stata disabilitata."

Questo errore si verificherà se DisableJavaScriptProxies è impostato, includendo anche un riferimento al proxy generato in modo dinamico in signalr/hubs. Per altre informazioni sulla creazione manuale del proxy, vedere Il proxy generato e le relative operazioni.

"L'ID connessione è nel formato non corretto" o "L'identità utente non può cambiare durante una connessione SignalR attiva"

Questo errore può essere visualizzato se viene usata l'autenticazione e il client viene disconnesso prima dell'arresto della connessione. La soluzione consiste nell'arrestare la connessione SignalR prima di disconnettere il client.

"Errore non rilevato: SignalR: jQuery non trovato. Assicurarsi che venga fatto riferimento a jQuery prima dell'errore SignalR.js file"

Il client JavaScript SignalR richiede l'esecuzione di jQuery. Verificare che il riferimento a jQuery sia corretto, che il percorso usato sia valido e che il riferimento a jQuery sia prima del riferimento a SignalR.

Errore "Uncaught TypeError: Cannot read property" of undefined "Uncaught TypeError: Cannot read property<>' of undefined" error

Questo errore causa la mancata presenza di jQuery o del proxy hub a cui si fa riferimento correttamente. Verificare che il riferimento a jQuery e il proxy hubs sia corretto, che il percorso usato sia valido e che il riferimento a jQuery sia prima del riferimento al proxy hubs. Il riferimento predefinito al proxy hub dovrebbe essere simile al seguente:

Codice lato client HTML che fa correttamente riferimento al proxy hub

<script src="/signalr/hubs"></script>

Errore "RuntimeBinderException non gestito dal codice utente"

Questo errore può verificarsi quando viene usato l'overload non corretto di Hub.On . Se il metodo ha un valore restituito, il tipo restituito deve essere specificato come parametro di tipo generico:

Metodo definito nel client (senza proxy generato)

MyHub.On<ReturnType>("MethodName", LocalMethod);

L'ID connessione è incoerente o interruzioni di connessione tra caricamenti di pagine

Questo comportamento dipende dalla progettazione. Poiché l'oggetto hub è ospitato nell'oggetto pagina, l'hub viene eliminato definitivamente quando la pagina viene aggiornata. Un'applicazione a più pagine deve mantenere l'associazione tra gli utenti e gli ID di connessione in modo che siano coerenti tra i caricamenti di pagine. Gli ID di connessione possono essere archiviati nel server in un ConcurrentDictionary oggetto o in un database.

Errore "Il valore non può essere null"

I metodi lato server con parametri facoltativi non sono attualmente supportati; se il parametro facoltativo viene omesso, il metodo avrà esito negativo. Per altre informazioni, vedere Parametri facoltativi.

Errore "Firefox non è in grado di stabilire una connessione al server all'indirizzo<>" in Firebug

Questo messaggio di errore può essere visualizzato in Firebug se la negoziazione del trasporto WebSocket ha esito negativo e viene utilizzato un altro trasporto. Questo comportamento dipende dalla progettazione.

Errore "Il certificato remoto non è valido in base alla procedura di convalida" nell'applicazione client .NET

Se il server richiede certificati client personalizzati, è possibile aggiungere un certificato x509certificate alla connessione prima che venga effettuata la richiesta. Aggiungere il certificato alla connessione usando Connection.AddClientCertificate.

La connessione si interrompe dopo il timeout dell'autenticazione

Questo comportamento dipende dalla progettazione. Le credenziali di autenticazione non possono essere modificate mentre una connessione è attiva; per aggiornare le credenziali, la connessione deve essere arrestata e riavviata.

OnConnected viene chiamato due volte quando si usa jQuery Mobile

La funzione di initializePage jQuery Mobile forza l'esecuzione nuovamente degli script in ogni pagina, creando così una seconda connessione. Le soluzioni per questo problema includono:

  • Includere il riferimento a jQuery Mobile prima del file JavaScript.
  • Disabilitare la initializePage funzione impostando $.mobile.autoInitializePage = false.
  • Attendere il completamento dell'inizializzazione della pagina prima di avviare la connessione.

I messaggi vengono ritardati nelle applicazioni Silverlight tramite eventi inviati dal server

I messaggi vengono ritardati quando si usano gli eventi inviati dal server in Silverlight. Per forzare invece l'uso del polling lungo, usare quanto segue all'avvio della connessione:

connection.Start(new LongPollingTransport());

"Autorizzazione negata" con il protocollo Forever Frame

Si tratta di un problema noto, descritto qui. Questo sintomo può essere visto usando la libreria JQuery più recente; la soluzione alternativa consiste nel effettuare il downgrade dell'applicazione a JQuery 1.8.2.

Errori di compilazione e lato server

La sezione seguente contiene possibili soluzioni agli errori di runtime lato server e del compilatore.

Il riferimento all'istanza dell'hub è Null

Poiché viene creata un'istanza hub per ogni connessione, non è possibile creare manualmente un'istanza di un hub nel codice. Per chiamare metodi in un hub dall'esterno dell'hub stesso, vedere Come chiamare i metodi client e gestire i gruppi dall'esterno della classe Hub per informazioni su come ottenere un riferimento al contesto dell'hub.

HTTPContext.Current.Session è Null

Questo comportamento dipende dalla progettazione. SignalR non supporta lo stato della sessione ASP.NET, perché l'abilitazione dello stato della sessione interrompe la messaggistica duplex.

Nessun metodo appropriato per eseguire l'override

Questo errore può verificarsi se si usa codice di documentazione o blog meno recenti. Verificare di non fare riferimento ai nomi dei metodi modificati o deprecati ,ad esempio OnConnectedAsync.

HostContextExtensions.WebSocketServerUrl è null

Questo comportamento dipende dalla progettazione. Questo membro è deprecato e non deve essere utilizzato.

Errore "Una route denominata 'signalr.hubs' è già presente nella raccolta di route"

Questo errore verrà visualizzato se MapHubs viene chiamato due volte dall'applicazione. Alcune applicazioni di esempio chiamano MapHubs direttamente nel file dell'applicazione globale; altre emettono la chiamata in una classe wrapper. Assicurarsi che l'applicazione non eseeva entrambe le operazioni.

Problemi di Visual Studio

Questa sezione descrive i problemi riscontrati in Visual Studio.

Il nodo Documenti script non viene visualizzato in Esplora soluzioni

Alcune esercitazioni indirizzano l'utente al nodo "Script Documents" in Esplora soluzioni durante il debug. Questo nodo viene prodotto dal debugger JavaScript e verrà visualizzato solo durante il debug dei client del browser in Internet Explorer; il nodo non verrà visualizzato se vengono usati Chrome o Firefox. Il debugger JavaScript non verrà eseguito anche se è in esecuzione un altro debugger client, ad esempio il debugger silverlight.

SignalR non funziona in Visual Studio 2008 o versioni precedenti

Questo comportamento dipende dalla progettazione. SignalR richiede .NET Framework 4 o versione successiva; Ciò richiede che le applicazioni SignalR vengano sviluppate in Visual Studio 2010 o versioni successive.

Problemi di IIS

Questa sezione contiene problemi con Internet Information Services.

Arresto anomalo del sito Web dopo la chiamata a MapHubs

Questo problema è stato risolto nella versione più recente di SignalR. Verificare di usare la versione rilasciata più recente di SignalR aggiornando l'installazione usando NuGet.

Problemi di Azure

Questa sezione contiene problemi con Microsoft Azure.

I messaggi non vengono ricevuti tramite il backplane di Azure dopo aver modificato i nomi degli argomenti

Gli argomenti usati dal backplane di Azure non devono essere configurabili dall'utente.