【发布时间】: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<UniveraHub>。确实,您不应该创建自己的MyHubHelper实例 - 它应该从 DI 容器中解析。 -
@KirkLarkin 这是我不知道如何从 DI 容器中解决 MyHubHelper 类的问题。能给我举个例子吗?
-
@KirkLarkin 如果我删除它想要的空 ctor HubContext 那么我在哪里可以找到并提供它?
标签: c# asp.net-core signalr signalr-hub