2015-05-28 18 views
6

Tôi có một ứng dụng SignalR đang hoạt động cho phép tôi kết nối nhiều máy khách JavaScript và trao đổi dữ liệu. Khi tôi cố gắng kết nối với một .NET client tôi nhận được lỗi sau:HttpClientException khi kết nối với trung tâm làm việc từ SignalR .NET Client

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 
} 

Để loại bỏ càng nhiều biến càng tốt tôi đã sao chép Hub thành một thương hiệu ứng dụng web mới và sao chép mã khách hàng NET vào một giao diện điều khiển ứng dụng. Tôi vẫn nhận được ngoại lệ tương tự. Đây là mã khách hàng của tôi:

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 

Dưới đây là giao diện điều khiển đầu ra:

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 

Và đây là mã trung tâm của tôi:

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

Cố gắng [bật SignalR truy tìm trên máy chủ] (http:. //www.asp. net/signalr/overview/testing-and-debugging/enable-signalr-tracing). Hy vọng SignalR sẽ ghi lại lỗi ... –

Trả lời

10

này hóa ra lại là một sai lầm nhỏ, nhưng thông báo lỗi quá vô ích, tôi chắc chắn rằng những người khác sẽ bị bối rối bởi cùng một vấn đề. Tên của trung tâm là sai. Tôi đã sử dụng "Trò chuyện" khi tôi nên sử dụng "ChatHub".

Nếu ngoại lệ đã là 404 hoặc "Không tìm thấy trung tâm" hoặc một cái gì đó tương tự, nó sẽ là một bản sửa lỗi dễ dàng hơn là một vài giờ lãng phí!

+4

Điều này cũng có thể xảy ra nếu tên đúng nhưng lớp 'Hub' không được công khai. –

+1

Tôi mất một nửa trong ngày để thấy rằng đó là do lỗi đánh máy trong CreateHubProxy! Tôi ghét kết thúc muộn và không gõ mạnh. –

+0

Cảm ơn bạn đã lưu ngày – Dinuka

1

vấn đề đã được giải quyết Bất nhưng tôi nghĩ rằng điều quan trọng là nhận ra rằng SignalR máy chủ trở về tình trạng 500 (Internal Server Error) (không phải là rất nhiều thông tin lỗi thực sự) là tính năng an ninh .

Nếu bạn cần biết thêm thông tin về lỗi máy chủ, bạn có thể làm như sau:

1) Enable tracing on server

và \ hoặc

2) Kích hoạt tính năng chi tiết các thông điệp ngoại lệ gửi cho khách hàng (không làm rằng trong sản xuất):

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

bình luận @ Michael Tiller trong @ câu trả lời Darren bật ra được giải pháp cho vấn đề của tôi, vì vậy tôi nghĩ rằng nó là công bằng để làm điều này vào câu trả lời của riêng mình:

Thay đổi lớp Hub đến public đã giải quyết được sự cố của tôi. Tôi đi theo một ví dụ và bỏ lỡ các văn bản mà nói để tạo ra một lớp CÔNG thừa kế từ Hub, và khi thêm một lớp mới trong Visual Studio, theo mặc định nó tạo ra nó như

class TestHub 
{ 
} 

... đó là về mặt kỹ thuật internal (xem here). Đọc kỹ hơn về phần của tôi sẽ ngăn chặn điều này, nhưng trong trường hợp một người khác đã quá vội vàng như tôi đã làm ... :)

0

Tôi đã làm sai lầm tầm thường tương tự mất vài giờ để tìm ra.

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

} 

Nhưng tôi đã cố gắng kết nối bằng cách xác định tên proxy trong ứng dụng khách.

HostProxyName = "Hostsync"; 

Chỉ cần đảm bảo không có loại lỗi như vậy. Vì bạn sẽ không nhận được ngoại lệ chi tiết chính xác trong quá trình thiết lập kết nối.

Các liên kết sau đây đã giúp tôi để giải quyết vài điều

Stackoverflow Question Answer Link

Hope this helps,

Các vấn đề liên quan