Risoluzione dei problemi di SignalR

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.

Versioni software usate in questo argomento

Versioni precedenti di questo argomento

Per informazioni sulle versioni precedenti di SignalR, vedere Versioni precedenti di SignalR.

Domande e commenti

Lasciare commenti e suggerimenti su come è piaciuta questa esercitazione e ciò che è possibile migliorare nei commenti nella parte inferiore della pagina. Se si hanno domande che non sono direttamente correlate all'esercitazione, è possibile pubblicarli nel forum ASP.NET SignalR o StackOverflow.com.

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 che non vengono chiamati, è possibile attivare la registrazione prima della chiamata al 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

App.MapSignalR();

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();
    }
}

OnDisconnect non si attiva in momenti coerenti

Questo comportamento dipende dalla progettazione. Quando un utente tenta di spostarsi da una pagina con una connessione SignalR attiva, il client SignalR eseguirà quindi un tentativo ottimale di notificare al server che la connessione client verrà arrestata. Se il tentativo migliore di tentativo del client SignalR non riesce a raggiungere il server, il server eliminerà la connessione dopo una configurazione configurabile DisconnectTimeout in un secondo momento, in cui verrà generato l'evento OnDisconnected . Se il tentativo di lavoro migliore del client SignalR ha esito positivo, l'evento OnDisconnected verrà generato immediatamente.

Per informazioni sull'impostazione dell'impostazione, vedere Gestione degli DisconnectTimeouteventi di durata della connessione: DisconnectTimeout.

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;

Configurazione di websockets IIS per ping/pong per rilevare un client non visibile

I server SignalR non sanno se il client è morto o meno e si basano sulla notifica dal websocket sottostante per gli errori di connessione, ovvero il OnClose callback. Una soluzione a questo problema consiste nel configurare websocket IIS per eseguire il ping/pong per l'utente. Ciò garantisce che la connessione venga chiusa se si interrompe in modo imprevisto. Per altre informazioni, vedere questo post di stackoverflow.

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 MapSignalR.

  • Uso di IIS 7 o 7.5 senza l'aggiornamento per GLI URL senza estensione: L'uso di IIS 7 o 7.5 richiede un aggiornamento per gli URL senza estensione in modo che il server possa fornire l'accesso alle definizioni dell'hub in /signalr/hubs. L'aggiornamento è disponibile qui.

  • Cache IIS non aggiornata o danneggiata: Per verificare che il contenuto della cache non sia aggiornato, immettere il comando seguente in una finestra di PowerShell per cancellare la cache:

    net stop w3svc
    Remove-Item -Path "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\*" -Force -Recurse
    net start w3svc
    

"Errore del server interno 500"

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

Questo errore viene anche comunemente rilevato se un firewall o un proxy non è configurato correttamente, causando la riscrizione delle intestazioni della richiesta. La soluzione consiste nel verificare che la porta 80 sia abilitata nel firewall o nel proxy.

"Codice di risposta imprevisto: 500"

Questo errore può verificarsi se la versione di .NET Framework usata nell'applicazione non corrisponde alla versione specificata in Web.Config. La soluzione consiste nel verificare che .NET 4.5 venga usato sia nelle impostazioni dell'applicazione che nel file Web.Config.

Errore "TypeError: <hubType> non definito"

Questo errore determina se la chiamata a MapSignalR non viene effettuata correttamente. Per altre informazioni, vedere Come registrare il middleware 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 i membri in un oggetto lato server che non si vuole inviare al client (per la 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 Trasporti e fallback .

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

Questo errore si verificherà se DisableJavaScriptProxies è impostato anche includendo un riferimento al proxy generato dinamicamente in signalr/hubs. Per altre informazioni sulla creazione manuale del proxy, vedere Proxy generato e ciò che fa per l'utente.

"L'ID connessione è in formato non corretto" o "L'identità utente non può cambiare durante un errore di connessione SignalR attivo"

Questo errore può essere visualizzato se l'autenticazione viene usata e il client viene disconnesso prima che la connessione venga arrestata. La soluzione consiste nell'arrestare la connessione SignalR prima di disconnettersi dal client.

"Errore non insegnato: SignalR: jQuery non trovato. Assicurarsi che jQuery venga fatto riferimento 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: Impossibile leggere la proprietà '<property>' di errore non definito"

Questo errore comporta la mancata presenza di jQuery o del proxy hub a cui viene fatto 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 riferimento correttamente 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 interruzione di connessione tra carichi di pagina

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

Errore "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 può 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 usato 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 x509certificate alla connessione prima dell'invio della richiesta. Aggiungere il certificato alla connessione usando Connection.AddClientCertificate.

La connessione viene eliminata 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 jQuery Mobile forza l'esecuzione initializePage 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 usando eventi inviati dal server

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

connection.Start(new LongPollingTransport());

"Autorizzazione negata" usando 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 eseguire il downgrade dell'applicazione a JQuery 1.8.2.

"InvalidOperationException: non una richiesta di socket Web valida.

Questo errore può verificarsi se viene usato il protocollo WebSocket, ma il proxy di rete modifica le intestazioni della richiesta. La soluzione consiste nel configurare il proxy per consentire WebSocket sulla porta 80.

"Eccezione: <impossibile risolvere il metodo del nome> del metodo" quando il metodo chiama client nel server

Questo errore può causare l'uso di tipi di dati che non possono essere individuati in un payload JSON, ad esempio Array. La soluzione alternativa consiste nell'usare un tipo di dati individuabile da JSON, ad esempio IList. Per altre informazioni, vedere .NET Client non è in grado di chiamare i metodi dell'hub con parametri di matrice.

Errori di compilazione e lato server

La sezione seguente contiene possibili soluzioni per gli errori di runtime sul lato server e del compilatore.

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 MapSignalR viene chiamato due volte dall'applicazione. Alcune applicazioni di esempio chiamano MapSignalR direttamente nella classe Startup; altre emettono la chiamata in una classe wrapper. Assicurarsi che l'applicazione non eseeva entrambe le operazioni.

WebSocket non viene usato

Se si è verificato che il server e i client soddisfino i requisiti per WebSocket (elencati nel documento Piattaforme supportate ), sarà necessario abilitare WebSocket nel server. Le istruzioni per eseguire questa operazione sono disponibili qui.

$.connection non definito

Questo errore indica che gli script in una pagina non vengono caricati correttamente oppure il proxy hub non è raggiungibile o non è accessibile in modo errato. Verificare che i riferimenti allo script nella pagina corrispondano agli script caricati nel progetto e che sia possibile accedere a /signalr/hubs in un browser quando il server è in esecuzione.

Non è possibile trovare uno o più tipi necessari per compilare un'espressione dinamica

Questo errore indica che la Microsoft.CSharp libreria è mancante. Aggiungerlo nella scheda Assembly-Framework>.

Non è possibile accedere allo stato del chiamante da Clients.Caller in Visual Basic o in un hub fortemente tipizzato; Errore "Conversione dal tipo 'Task(Of Object)' al tipo 'String' non valido"

Per accedere allo stato del chiamante in Visual Basic o in un hub fortemente tipizzato, usare la Clients.CallerState proprietà (introdotta in SignalR 2.1) anziché Clients.Caller.

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. Il componente server di SignalR richiede .NET Framework 4.5.

Problemi di IIS

Questa sezione contiene problemi con Internet Information Services.

SignalR funziona nel server di sviluppo di Visual Studio, ma non in IIS

SignalR è supportato in IIS 7.0 e 7.5, ma è necessario aggiungere il supporto per gli URL senza estensione. Per aggiungere il supporto per gli URL senza estensione, vedere https://support.microsoft.com/kb/980368

SignalR richiede l'installazione di ASP.NET nel server (ASP.NET non è installato in IIS per impostazione predefinita). Per installare ASP.NET, vedere download di ASP.NET.

Problemi di Microsoft Azure

Questa sezione contiene problemi con Microsoft Azure.

FileLoadException quando si ospita SignalR in un ruolo di lavoro di Azure

L'hosting di SignalR in un ruolo di lavoro di Azure potrebbe causare l'eccezione "Impossibile caricare il file o l'assembly "Microsoft.Owin, Version=2.0.0.0". Si tratta di un problema noto con NuGet; I reindirizzamenti di binding non vengono aggiunti automaticamente nei progetti ruolo di lavoro di Azure. Per risolvere questo problema, è possibile aggiungere manualmente i reindirizzamenti dell'associazione. Aggiungere le righe seguenti al file per il app.config progetto Ruolo di lavoro.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

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

Gli argomenti usati dal backplane di Azure vengono gestiti internamente; non devono essere configurabili dall'utente.