【问题标题】:Get Instance of HubContext for re-use anywhere At SelfHosted Asp.net core Application获取 HubContext 实例以便在 SelfHosted Asp.net 核心应用程序的任何地方重复使用
【发布时间】:2019-08-11 08:33:57
【问题描述】:

我有一个在控制台上运行的自托管 asp.net 核心应用程序。我可以从我的 c# windows 窗体客户端发送消息。但我想在我的服务器类的任何地方向客户端发送消息。不是一次消息。所以我需要 hubcontext 实例来重用它。

我使用了 IHubContext 实现,但是当我使用集线器上下文时出现 NullReference 异常。

这是我的中心。

 public class UniveraHub : Microsoft.AspNetCore.SignalR.Hub
{
    public string GetConnectionId()
    {
        return Context.ConnectionId;
    }

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

}

这是我的创业班

   public class Startup
{

    public void Configure(IApplicationBuilder app)
    {

        app.UseSignalR(routes =>
        {
            routes.MapHub<UniveraHub>("/UniveraHub");
        });


    }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
        services.AddScoped<MyHubHelper>();
    }
}

这是我的 HubHelper 类

 public class MyHubHelper 
{
    private readonly IHubContext<UniveraHub> _hubContext;

    public MyHubHelper(IHubContext<UniveraHub> hubContext)
    {
        _hubContext = hubContext;
    }

    public MyHubHelper()
    {

    }

    public void SendOutAlert(string msg)
    {
        _hubContext.Clients.All.SendAsync("ReceivedMessage", msg);
    }
}

我正在使用我的助手类向客户发送消息的这个 program.cs

  MyHubHelper helper = new MyHubHelper();
  helper.SendOutAlert("Hi from server!");

【问题讨论】:

  • 很可能你的空MyHubHelper构造函数正在被使用,这将使_hubConext保持为null
  • @KirkLarkin 那我该怎么办?有什么想法吗?
  • 您必须删除空的构造函数,并在创建实例时传入IHubContext&lt;UniveraHub&gt;。确实,您不应该创建自己的 MyHubHelper 实例 - 它应该从 DI 容器中解析。
  • @KirkLarkin 这是我不知道如何从 DI 容器中解决 MyHubHelper 类的问题。能给我举个例子吗?
  • @KirkLarkin 如果我删除它想要的空 ctor HubContext 那么我在哪里可以找到并提供它?

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


【解决方案1】:

Program.cs 你可以像下面这样使用:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args)
                    .Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            var helper = services.GetRequiredService<MyHubHelper>();
            helper.SendOutAlert("Hi from server!");
        }

        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

【讨论】:

  • 嗨,我得到的“IServiceProvider”不包含“CreateScope”的定义,并且找不到接受“IServiceProvider”类型的第一个参数的可访问扩展方法“CreateScope”(您是否缺少使用指令还是程序集引用?)错误
  • 使用 Microsoft.Extensions.DependencyInjection 添加时已修复;但是我如何在 Helper Class 调用我的发送消息方法?如果我创建新实例,它会再次给出 null 错误。
  • 您不必创建该类的新实例。我已经更新了答案。
  • 我需要 HubContext 实例,这不是我想要的最佳方式。
  • 请更新问题,说明您使用它的方式以及出现错误的位置。
猜你喜欢
  • 2015-02-23
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多