访问 asp.net 核心信号器中的 hubcontext 实例

Accessing a hubcontext instance in asp.net core signalr

我正在关注 guide 为我的 asp.net 核心项目设置信号器。

在遵循本指南的同时,我得到了这段代码:

void SendMessage(string message)
{
   GlobalHost
  .ConnectionManager
  .GetHubContext<NotificationHub>().Clients.sendMessage(
message);
}

我有一个 NotificationHub 文件,如下所示:

public class NotificationHub : Hub
{
    public string Activate()
    {
        return "Monitor Activated";
    }
}

Globalhost 用于获取 Hubcontext 对象。 问题是当我导入 signalR 时,没有任何名为 GlobalHost 的东西可用。在 documentation 我可以找到关于它的信息:

GlobalHost

ASP.NET Core has dependency injection (DI) built into the framework. Services can use DI to 
access the HubContext. The GlobalHost object that is used in ASP.NET SignalR to get a HubContext 
doesn't exist in ASP.NET Core SignalR.

好的,所以 Globalhost 在核心中根本不可用。

我需要做同样的代码,但是 Microsoft.AspNetCore.SignalR;

现在我怎样才能得到一个 Hubcontext 对象?

编辑

我现在尝试按照文档中的最小示例创建一个小型示例项目。 我的``startup.csfile has this line, inConfigureServices`:

services.AddSignalR();

Configure 中的这一行:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<NotificationHub>("/Hubs");
    });

我的 Hub 文件如下所示,如文档中所示:

namespace mvcCoreSample.Hubs
{
    public class NotificationHub : Hub
    {
        public Task SendMessage(string user, string message)
        {
            return Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}

其中 Hubs 是与 startup.cs 位于同一目录中的文件夹。 我有一个看起来像这样的控制器,它调用集线器:

public class msgController : Controller
{
    public IActionResult Index()
    {
        NotificationHub hub = new NotificationHub();
        hub.SendMessage("user1", "some message");
        return Content("serving content");
    }
}

但是当我 运行 这个,并转到控制器的 url 时,集线器在 sendmessage 函数中抛出错误:

Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.

我真的看不出哪里错了,hub 一定是少了什么?也许与建立连接有关?

编辑 2

经过几次更正,我将控制器更改为如下所示:

public IActionResult Index(IHubContext<NotificationHub> hub)
{
    var clients = hub.Clients;
    return Content("serving content");
}

尽管我仍然不知道如何调用我的 sendmessage 函数,但我想试试这个。

当 运行在调试模式下连接此站点时,我在浏览器中抛出此错误:

InvalidOperationException: Could not create an instance of type 'Microsoft.AspNetCore.SignalR.IHubContext`1[[mvcCoreSample.Hubs.NotificationHub, mvcCoreSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, give the 'hub' parameter a non-null default value.

您可以像这样将其注入服务的构造函数中:

SomeService(IHubContext<NotificationHub> hub)

您可能正在查看一些旧文档。请在此处查看官方文档:Use hubs in SignalR for ASP.NET Core