我有一个有效的SignalR应用程序,它允许我连接多个JavaScript客户端并交换数据。当我尝试连接.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
}
要删除尽可能多的变量,我将Hub复制到一个全新的Web应用程序中,并将.NET客户端代码复制到控制台应用程序中。我仍然得到同样的例外。这是我的客户代码:
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
这是控制台输出:
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
这是我的中心代码:
public class ChatHub : Hub
{
public void SendMessage(string name, string message)
{
Clients.All.ReceiveMessage(name, message);
}
}
答案 0 :(得分:14)
这结果是一个微不足道的错误,但错误信息是如此无用我确定其他人会被同样的问题困扰。集线器的名称是错误的。我用了#34;聊天"当我应该使用" ChatHub"。
如果异常是404,或者#34; Hub未找到"或类似的东西,这将是一个简单的解决方案,而不是几个浪费的时间!
答案 1 :(得分:5)
将Hub类更改为public
解决了我的问题。我按照一个示例错过了创建一个继承自Hub
的PUBLIC类的文本,并且在Visual Studio中添加新类时,默认情况下将其创建为
class TestHub
{
}
......技术上internal
(见here)。更谨慎的阅读本身就可以防止这种情况发生,但万一其他人像我一样匆匆忙忙......:)
答案 2 :(得分:1)
真正的问题已解决但我认为重要的是要意识到SignalR服务器返回状态500(内部服务器错误)(确实不是非常有用的错误)是安全功能。
如果您需要有关服务器错误的更多信息,可以执行以下操作:
和\或
2)启用发送给客户端的详细异常消息(不要在生产中执行此操作!):</ p>
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 :(得分:0)
我做了类似的琐碎错误花了几个小时来搞清楚。
Route::group([ 'middleware' => 'auth'] , function() {
Route::get('admin', function() {
return view('master');
});
Route::get('admin/categories','CategoryController@index')->name('categories.index');
Route::get('admin/categories/create','CategoryController@create')->name('categories.create');
Route::post('admin/categories/store','CategoryController@store')->name('categories.store');
Route::get('admin/categories/edit/{id}','CategoryController@edit')->name('categories.edit');
Route::post('admin/categories/update/{id}','CategoryController@update')->name('categories.update');
Route::delete('admin/categories/delete/{id}','CategoryController@destroy')->name('categories.destroy');
});
但我试图通过在Client中定义代理名称来进行连接。
[HubName("Hostsync")] // Missed to add this attribute in Hub of SignalR Self Host
public class ChatHub : Hub
{
}
确保没有这样的错误。由于在建立连接期间不会得到确切的详细异常。
以下链接帮助我解决了一些问题
Stackoverflow Question Answer Link
希望这会有所帮助。
答案 4 :(得分:0)
我有同样的问题。我发现SignalR Jquery扩展版本早于所引用的SignalR库。我更正了脚本版本并解决了问题。如果您最近将SignalR升级到了较新的版本,则可能会遇到与我相同的问题。