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

时间:2019-04-16 09:39:54

标签: c# asp.net-core signalr signalr-hub

我有一个基本的控制器类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 core。因此,在asp.net核心中找不到以下功能:

  • IHub
  • IHubContext
  • GlobalHost

Iconvert如何上课?

1 个答案:

答案 0 :(得分:1)

HubIHubContext<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,因为它们使使用中心环境更好一些。