2015-05-28 14 views
6

Mam działającą aplikację SignalR, która umożliwia mi podłączanie wielu klientów JavaScript i wymianę danych. Kiedy próbowałem się połączyć z klientem .NET pojawia się następujący błąd:Wyjątek HttpClientException podczas nawiązywania połączenia z działającym koncentratorem z klienta 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 
} 

usunięcie tak wielu zmiennych, jak to możliwe skopiowane do Hub z nowej aplikacji internetowej marki i skopiowane kod klienta .NET do konsoli podanie. Nadal mam ten sam wyjątek. Oto mój kod klienta:

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 

tutaj jest wyjście konsoli:

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 

I tu jest mój kod piasta:

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

Spróbuj [włącz SignalR śledzenie na serwerze] (http:. //www.asp. net/signalr/overview/testing-and-debugging/enable-signalr-tracing). Mam nadzieję, że SignalR zarejestruje błąd ... –

Odpowiedz

10

To okazało się być banalny błąd, ale komunikat o błędzie był tak bezużyteczny Jestem pewien, że inni będą zaskoczeni tym samym problemem. Nazwa centrum była błędna. Użyłem "czatu", kiedy powinienem użyć "ChatHub".

Jeśli wyjątek był 404, lub "Hub nie znaleziono" lub coś w tym stylu, byłoby to łatwa poprawka, a nie kilka straconych godzin!

+4

Może się to również zdarzyć, jeśli nazwa jest poprawna, ale klasa 'Hub' nie jest publiczna. –

+1

Zajęło mi pół dnia, aby stwierdzić, że jest to spowodowane literówką w CreateHubProxy! Nienawidzę późnego wiązania i nietrwałego pisania. –

+0

Dzięki temu zapisano dzień – Dinuka

1

prawdziwy problem został rozwiązany ale myślę, że ważne jest, aby uświadomić sobie, że serwer SignalR powracającego statusu 500 (Internal Server Error) (nie błąd rzeczywiście bardzo pouczające) jest cechą bezpieczeństwo.

Jeżeli potrzebują Państwo więcej informacji na temat błędów serwera, można wykonać następujące czynności:

1) Enable tracing on server

i \ lub

2) Włącz szczegółowe komunikaty wyjątków wysłać do klienta (nie rób że w produkcji):

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

komentarz @Michael Rumpel w @ odpowiedź Darrena okazała się być rozwiązaniem na mój problem, więc myślę, że to sprawiedliwe, aby ten w jego własnej odpowiedzi:

Zmiana klasy Hub do public rozwiązał mój problem. Poszedłem za przykład i nieodebranych tekst, który powiedział, aby utworzyć publiczną klasę, która dziedziczy Hub i podczas dodawania nowej klasy w Visual Studio domyślnie tworzy go jako

class TestHub 
{ 
} 

... co jest technicznie internal (patrz here). Ostrożniejsze czytanie z mojej strony uniemożliwiłoby to, ale na wypadek, gdyby ktoś inny zbytnio się spieszył, jak ja ... :)

0

Podobny banalny błąd zajął kilka godzin, aby go rozgryźć.

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

} 

Ale próbowałem się połączyć, definiując nazwę proxy w Client.

HostProxyName = "Hostsync"; 

Tylko upewnij się, że nie ma takich błędów. Ponieważ nie otrzymasz dokładnego szczegółowego wyjątku podczas ustanawiania połączenia.

Poniższy link pomógł mi rozwiązać kilka rzeczy

Stackoverflow Question Answer Link

nadzieję, że to pomaga,

Powiązane problemy