【问题标题】:SignalR 2.1.0: The connection has not been establishedSignalR 2.1.0:连接尚未建立
【发布时间】:2014-07-25 21:02:21
【问题描述】:

我有一个 ASP.NET Web 应用程序,它带有一个简单的 HTML 页面和一些通过 SignalR 进行通信的 JavaScript。这很好用。 现在我正在尝试从另一个项目(在同一解决方案中)并使用 .NET Signalr Client Api 调用集线器上的方法:

        var connection = new HubConnection("http://localhost:32986/");
        var hub = connection.CreateHubProxy("MessageHub");
        connection.Start();
        hub.Invoke("SendMessage", "", "");

最后一行导致 InvalidOperationException: The connection has not been established. 但我能够从我的 JavaScript 代码连接到集线器。

如何使用 C# 代码连接到 Hub?

更新

写完这篇文章的那一刻,我尝试添加.Wait(),它成功了! 这样就可以了:

        var connection = new HubConnection("http://localhost:32986/");
        var hub = connection.CreateHubProxy("MessageHub");
        connection.Start().Wait();
        hub.Invoke("SendMessage", "", "");

【问题讨论】:

  • 非常感谢!添加 .Wait() 也对我有用。我在 Windows 服务中托管了一个集线器,该服务还需要对集线器的客户端引用,以便它调用集线器中的方法(基于服务中的计时器)。相同的代码来创建客户端引用并且在我将 .Wait() 添加到 Start() 方法之前也得到了相同的“连接尚未建立”错误。很有趣,因为我正在从一个没有使用 .Wait() 的示例开始工作,但工作正常。可能只是两个应用程序之间的某种时间差异。

标签: c# signalr


【解决方案1】:

HubConnection.Start 返回一个Task,在调用方法之前需要完成该Task

执行此操作的两种方法是在异步方法中使用 await,或者在非异步方法中使用 Task.Wait()

public async Task StartConnection()
{
    var connection = new HubConnection("http://localhost:32986/");
    var hub = connection.CreateHubProxy("MessageHub");
    await connection.Start();
    await hub.Invoke("SendMessage", "", "");
    // ...
}

// or

public void StartConnection()
{
    var connection = new HubConnection("http://localhost:32986/");
    var hub = connection.CreateHubProxy("MessageHub");
    connection.Start().Wait();
    hub.Invoke("SendMessage", "", "").Wait();
    // ...
}

ASP.NET SignalR Hubs API Guide for the .NET client. 的“如何建立连接”部分更详细。

【讨论】:

  • 第三个选项:ContinueWith。这本质上是在客户端完成的方式,因此它在 JS 和 C# 用法之间增加了一点一致性。
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多