Asp.net SignalR 功能在 asp.net 核心中不起作用

Asp.net SignalR features does not work in asp.net core

我有一个基础控制器 class Asp.net 框架 4.6 是这样的:

public abstract class SignalRBaseController<THub> : ControllerBase where THub : IHub
{
    private static readonly Func<IHubContext> ValueFactory = () => GlobalHost.ConnectionManager.GetHubContext<THub>();

    private readonly Lazy<IHubContext> hub = new Lazy<IHubContext>(ValueFactory);

    protected IHubContext Hub => hub.Value;
}

然后我将项目转换为 asp.net 核心。因此,asp.net 核心中没有以下功能:

如何转换我的 class?

Hub and IHubContext<THub> 还在。您可以使用依赖注入而不是静态 GlobalHost

我不会直接翻译你的抽象控制器,因为我相信它实际上没有那么有用:假设你有一个控制器只接受一个集线器上下文(而不是其他依赖项)似乎假设很多。这里并不真正需要惰性模式。

因此,这显示了一个示例控制器实现,它使用集线器上下文作为其依赖项的一部分:

public class ExampleController : ControllerBase
{
    private readonly IHubContext<MyHub> _myHubContext;

    public ExampleController(IHubContext<MyHub> myHubContext)
    {
        _myHubContext = myHubContext;
    }

    [HttpPost]
    public async Task<IActionResult> PostMessage(string message)
    {
        await _myHubContext.Clients.All.SendAsync("DoSomething", message);
        return Ok();
    }
}

我还建议您查看 strongly typed hubs,因为它们可以更好地使用 hub 上下文。