SignalR HUb如何使用IHubContext C#

时间:2019-11-14 14:44:06

标签: c# asp.net-core signalr

我需要一些帮助,以了解他们是否对signalR做错了。放手:

我的应用程序是mvc。我按照教程的示例进行操作,

我创建了一个RealTime类:

public class RealTime : Hub
{
    public async Task SendMessage(string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", message);
    }
}

在启动中:

 public void ConfigureServices(IServiceCollection services)
 {
    .
    .
    .
     services.AddSignalR();
 }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime appLifetime)
 {
  .
  .
  .
  app.UseSignalR(routes =>
        {
            routes.MapHub<RealTime>("/realtime");
        });
  }

因此,我去了控制器并注入了IHubContext:

public class MyController : Controller
{
    private readonly IHubContext<RealTime> _hub;

    public MyController
    (
        IHubContext<RealTime> hub
    )
    {
        _hub = hub;
    }

在某些时候我使用:

   await _hub.Clients.All.SendAsync("ReceiveMessage", "Hello Word!");

在前端,我执行了以下操作:

  var connection = new signalR.HubConnectionBuilder().withUrl("/realtime").build();

  connection.on("ReceiveMessage", function (message) {
    Swal.fire(
    'The Internet?',
    message,
    'question'
   );
  });

  connection.start().then(function () {
   //
  }).catch(function (err) {
   //
  });

但是什么也没发生。后端或前端均无错误。但是什么也没发生!

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:0)

我注意到的第一件事是,您将集线器注入了Controller中,尝试将其注入到该Controller中被调用的服务/管理器中。 第二件事是,当您不在实现Hub的类中时,最好与SendCoreAsync()而不是SendAsync一起使用。 我建议您做的第三件事是将.configureLogging(signalR.LogLevel.Information) and then .build(); 另外,请确保此操作不会出错:import * as signalR from "@aspnet/signalr"; 同时启动连接并显示一条消息,以了解是否已建立连接

connection.start().then(function () {
   console.log("signalR connected")
  }).catch(function (err) {
   console.log(err)
  });

只有在开始连接后,我才将连接打开。

connection.on("ReceiveMessage", (message) =>{
        Swal.fire(
        'The Internet?',
        message,
        'question'
       );
      });

希望我能帮助您!

答案 1 :(得分:0)

感谢您的帮助。我找到了解决方案,尽管很难看。

在打开连接之前,我放了以下代码段:

  Object.defineProperty(WebSocket, 'OPEN', { value: 1, });

所以我的js是这样的:

 var connection = new signalR.HubConnectionBuilder()
  .withUrl("/realtime")
  .configureLogging(signalR.LogLevel.Debug)
  .build();

 Object.defineProperty(WebSocket, 'OPEN', { value: 1, });

  connection.start().then(function () {
     console.log("signalR connected")
  }).catch(function (err) {
     return console.error(err)
  });

  connection.on("ReceiveMessage", function (message) {
     Swal.fire(
      'The Internet?',
       message,
      'question'
     );
  });