2015-05-28 7 views
6

Possiedo un'applicazione SignalR funzionante che consente di collegare più client JavaScript e scambiare dati. Quando ho provato a connettersi con un client .NET ottengo il seguente errore:HttpClientException quando ci si connette all'hub funzionante dal client SignalR .NET

An exception of type 'Microsoft.AspNet.SignalR.Client.HttpClientException' occurred in mscorlib.dll but was not handled in user code 

Additional information: StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 

{ 
    Transfer-Encoding: chunked 
    X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcRGFycmVuXERlc2t0b3BcQ29uc29sZUFwcGxpY2F0aW9uMVxXZWJBcHBsaWNhdGlvbjFcc2lnbmFsclxuZWdvdGlhdGU=?= 
    Cache-Control: private 
    Date: Thu, 28 May 2015 09:13:06 GMT 
    Server: Microsoft-IIS/8.0 
    X-AspNet-Version: 4.0.30319 
    X-Powered-By: ASP.NET 
    Content-Type: text/html; charset=utf-8 
} 

Per rimuovere il maggior numero di variabili possibili Ho copiato il Hub in una nuova applicazione web del marchio e copiato il codice client .NET in una console applicazione. Ho ancora la stessa eccezione. Ecco il mio codice cliente:

Dim hubConnection As HubConnection 
Dim chatHubProxy As IHubProxy 

Public Async Sub RunTest() 
    System.Net.ServicePointManager.DefaultConnectionLimit = 10 

    hubConnection = New HubConnection("http://localhost:64400") 
    hubConnection.Credentials = Net.CredentialCache.DefaultCredentials 
    hubConnection.TraceLevel = TraceLevels.All 
    hubConnection.TraceWriter = Console.Out 

    chatHubProxy = hubConnection.CreateHubProxy("Chat") 

    AddHandler hubConnection.StateChanged, Sub(stateChange) Console.WriteLine("[" & DateTime.Now & "]: " & stateChange.OldState.ToString() & " => " & stateChange.NewState.ToString() & " " & hubConnection.ConnectionId) 

    chatHubProxy.On(Of String, String)("ReceiveMessage", Sub(from, message) Console.WriteLine(message)) 
    Await hubConnection.Start() 
End Sub 

Ecco l'output della console:

09:21:54.3952161 - null - ChangeState(Disconnected, Connecting) 
[28/05/2015 10:21:54]: Disconnected => Connecting 
[28/05/2015 10:21:56]: Connecting => Disconnected 
09:21:56.8448452 - null - Disconnected 
09:21:56.8458461 - null - Transport.Dispose() 
09:21:56.8468465 - null - Closed 

E qui è il mio codice hub:

public class ChatHub : Hub 
{ 
    public void SendMessage(string name, string message) 
    { 
     Clients.All.ReceiveMessage(name, message); 
    } 
} 
+0

Prova a [accendere SignalR analisi su server] (http:. //www.asp. net/signalr/panoramica/test-e-debugging/abilitazione-signalr-tracing). Eventualmente SignalR registrerà l'errore ... –

risposta

10

Questo si è rivelato essere un errore banale, ma il messaggio di errore era così inutile che sono sicuro che gli altri saranno sconcertati dallo stesso problema. Il nome dell'hub era sbagliato. Ho usato "Chat" quando avrei dovuto usare "ChatHub".

Se l'eccezione era stata 404, o "Hub non trovato" o qualcosa del genere sarebbe stata una soluzione semplice anziché un paio di ore sprecate!

+4

Ciò può accadere anche se il nome è corretto ma la classe 'Hub' non è pubblica. –

+1

Mi ci è voluto metà giornata per scoprire che è causato da errori di battitura in CreateHubProxy! Odio il binding tardivo e la digitazione non forte. –

+0

Grazie salvato il giorno – Dinuka

1

vero problema è stato risolto, ma penso che sia importante rendersi conto che server di SignalR ritorno di stato 500 (Internal Server Error) (non errore molto informativo in effetti) è la caratteristica di sicurezza .

Se avete bisogno di ulteriori informazioni su errori del server, si può fare seguente:

1) Enable tracing on server

e \ o

2) Attivare dettagliata messaggi di eccezione inviare al cliente (non faccio che in produzione):!

SignalR 1.x: RouteTable.Routes.MapHubs(new HubConfiguration { EnableDetailedErrors = true });

SignalR 2.x

public void Configuration(IAppBuilder app) 
{ 
     var hubConfiguration = new HubConfiguration 
     { 
#if DEBUG 
      EnableDetailedErrors = true 
#else 
      EnableDetailedErrors = false 
#endif 
     }; 

     app.MapSignalR(hubConfiguration); 
} 
3

commento di @ Michael Tiller in @ risposta di Darren si è rivelata la soluzione per il mio problema, quindi penso che sia giusto fare questo in una propria risposta:

Cambiare la classe Hub per public risolto il mio problema. Ho seguito un esempio e mancava il testo che ha detto di creare una classe pubblica che eredita da Hub, e quando si aggiunge una nuova classe in Visual Studio, per impostazione predefinita lo crea come

class TestHub 
{ 
} 

... che è tecnicamente internal (vedi here). Una lettura più attenta da parte mia avrebbe prevenuto questo, ma nel caso qualcuno fosse entrato troppo in fretta come me ... :)

0

Stavo facendo un errore banale simile, ci sono volute poche ore per capirlo.

[HubName("Hostsync")] // Missed to add this attribute in Hub of SignalR Self Host 
public class ChatHub : Hub 
{ 

} 

Ma stavo cercando di connettermi definendo il nome del proxy nel client.

HostProxyName = "Hostsync"; 

Assicurati che non ci siano errori di questo tipo. Dal momento che non si otterrà l'esatta eccezione dettagliata durante lo stabilimento della connessione.

Il seguente link aiutato me rivolgermi alcune cose

StackOverflow Question Answer Link

Spero che questo aiuti,

Problemi correlati