ASP.NET SignalR C# 客户端应用启动异常
ASP.NET SignalR C# Client App Exception on Start
我有一个 ASP.NET 应用程序。我 运行 它通过点击调试。它 运行 于 localhost:2842。
我在 class 中定义了一个 SignalR Hub,服务器上没有任何方法。
我有一个 WPF Windows C# 应用程序。我添加了 SignalR NuGet 包。我使用以下代码来实例化客户端代理:
var hubConnection = new HubConnection("http://localhost:2842");
IHubProxy myHubProxy = hubConnection.CreateHubProxy("MyHub");
myHubProxy.On<string>("SendMeData", dataString => {
Console.WriteLine("String value {0}", dataString);
});
hubConnection.Start().Wait();
这是我在服务器上定义的集线器 class:
public class MyHub : Hub
{
public static void SendMeData(string dataString)
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
if (context != null)
context.Clients.All.SendMeData(dataString);
}
}
我在 Startup.cs 中有此代码:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.MapSignalR(new HubConfiguration
{
EnableDetailedErrors = true
});
}
}
我遇到的问题是,当 C# 客户端调用 hubConnection.Start().Wait(); 时我得到一个非常无用的异常。这是例外情况:
StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content:
System.Net.Http.StreamContent, Headers: Transfer-Encoding: chunked
X-SourceFiles: =?UTF-8?B?QzpcTXlEZXZcUmVhbHRpbWVNRFxSZWFsdGltZU1EUHJvdG9cUmVhbHRpbWVNRFByb3RvXHNpZ25hbHJcbmVnb3RpYXRl?=
Cache-Control: private Date: Thu, 27 Apr 2017 04:23:18 GMT Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Type: text/html; charset=utf-8
我在服务器代码中设置了断点,但它从未命中任何断点。
我该如何解决这个问题?
在您的 MyHub class 中,您有以下行:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
if (context != null)
摆脱这个。相反,您的 MyHub class 应该是:
public class MyHub : Hub
{
public static void SendMeData(string dataString)
{
Clients.All.SendMeData(dataString);
}
}
GetHubContext 用于从同一 AppDomain 中的另一个 class 获取对 Hub 的引用。例如,如果您在 Controller class 中并且需要在同一 AppDomain 中的 Hub 上调用方法,您将通过 GetHubContext 获取对 Hub 的引用。
同样在您的客户端代码中,请删除 .Wait()。代码应该是
await hubConnection.Start();
整个问题最终是我在服务器中更改了集线器 class 的名称,但没有更改 CreateHubProxy 中使用的名称。它现在正在工作。
出现此症状可能有两个原因:
- 未找到集线器名称,或拼写错误。
- 集线器 class 不是 public。
总之,SignalR 库太烂了,不指出真正原因,只有 500 代码错误!!
我有一个 ASP.NET 应用程序。我 运行 它通过点击调试。它 运行 于 localhost:2842。
我在 class 中定义了一个 SignalR Hub,服务器上没有任何方法。
我有一个 WPF Windows C# 应用程序。我添加了 SignalR NuGet 包。我使用以下代码来实例化客户端代理:
var hubConnection = new HubConnection("http://localhost:2842");
IHubProxy myHubProxy = hubConnection.CreateHubProxy("MyHub");
myHubProxy.On<string>("SendMeData", dataString => {
Console.WriteLine("String value {0}", dataString);
});
hubConnection.Start().Wait();
这是我在服务器上定义的集线器 class:
public class MyHub : Hub
{
public static void SendMeData(string dataString)
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
if (context != null)
context.Clients.All.SendMeData(dataString);
}
}
我在 Startup.cs 中有此代码:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.MapSignalR(new HubConfiguration
{
EnableDetailedErrors = true
});
}
}
我遇到的问题是,当 C# 客户端调用 hubConnection.Start().Wait(); 时我得到一个非常无用的异常。这是例外情况:
StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content:
System.Net.Http.StreamContent, Headers: Transfer-Encoding: chunked
X-SourceFiles: =?UTF-8?B?QzpcTXlEZXZcUmVhbHRpbWVNRFxSZWFsdGltZU1EUHJvdG9cUmVhbHRpbWVNRFByb3RvXHNpZ25hbHJcbmVnb3RpYXRl?=
Cache-Control: private Date: Thu, 27 Apr 2017 04:23:18 GMT Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Type: text/html; charset=utf-8
我在服务器代码中设置了断点,但它从未命中任何断点。
我该如何解决这个问题?
在您的 MyHub class 中,您有以下行:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
if (context != null)
摆脱这个。相反,您的 MyHub class 应该是:
public class MyHub : Hub
{
public static void SendMeData(string dataString)
{
Clients.All.SendMeData(dataString);
}
}
GetHubContext 用于从同一 AppDomain 中的另一个 class 获取对 Hub 的引用。例如,如果您在 Controller class 中并且需要在同一 AppDomain 中的 Hub 上调用方法,您将通过 GetHubContext 获取对 Hub 的引用。
同样在您的客户端代码中,请删除 .Wait()。代码应该是
await hubConnection.Start();
整个问题最终是我在服务器中更改了集线器 class 的名称,但没有更改 CreateHubProxy 中使用的名称。它现在正在工作。
出现此症状可能有两个原因:
- 未找到集线器名称,或拼写错误。
- 集线器 class 不是 public。
总之,SignalR 库太烂了,不指出真正原因,只有 500 代码错误!!