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();

Reference

整个问题最终是我在服务器中更改了集线器 class 的名称,但没有更改 CreateHubProxy 中使用的名称。它现在正在工作。

出现此症状可能有两个原因:

  1. 未找到集线器名称,或拼写错误。
  2. 集线器 class 不是 public。

总之,SignalR 库太烂了,不指出真正原因,只有 500 代码错误!!