如何解决当我在 ASP.NET Core 中使用非控制器类时,SignalR 的客户端列表为空
我有一个 ASP.NET Core Web 服务和一个 Blazor 客户端。当我的方法在网络服务的类(而不是控制器)中被触发时,我想将我的数据发送给我的客户端。
当我使用控制器时,它可以工作,但在常规课程中,我看到 clients.All
为空,即使 OnConnectedAsync
被触发(意味着已连接)
据我所知,HubContext
不是单例而是瞬态。我尝试了很多东西,但连接的客户端列表是空的。
在我的Startup
中:
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
services.InstallServicesInAssembly(Configuration);
services.AddTransient<IGeneralStockMarketHandler,GeneralStockMarketHandler>();
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",policy =>
{
policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
});
}
public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
app.UseCors("CorsPolicy");
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<NotificationHub>("/notificationhub");
endpoints.MapControllers();
});
}
我的中心:
public class NotificationHub : Hub
{
public override Task OnConnectedAsync()
{
Console.WriteLine("Client has connected");
return base.OnConnectedAsync();
}
public override Task OndisconnectedAsync(Exception exception)
{
Console.WriteLine("Client has disconnected");
return base.OndisconnectedAsync(exception);
}
}
我注入 GeneralStockMarketHandler
的 IHubContext
类:
public GeneralStockMarketHandler(IHubContext<NotificationHub> hubContext)
{
_hubContext = hubContext;
}
private async void MyStockMarketHandler_OnDataReceived(StreamSnapshotResponseModel response)
{
await HandleStreamSnapshotResponse(response);
await _hubContext.Clients.All.SendAsync("notification",response.Data);
}
如上所示,_hubContext.Clients.All
即使有客户端连接也是空的,因此它不会发送任何客户端。
在我的 Blazor 应用中,Index.razor
:
@code {
string url = "http://localhost:1580/notificationhub";
HubConnection _connection = null;
bool isConnected = false;
string connectionStatus = "Ready";
private async Task ConnectToServer()
{
_connection = new HubConnectionBuilder()
.WithUrl(url)
.Build();
await _connection.StartAsync();
isConnected = true;
connectionStatus = "Connected";
_connection.Closed += async (s) =>
{
isConnected = false;
connectionStatus = "disconnected";
await _connection.StartAsync();
isConnected = true;
};
_connection.On<string>("notification",m =>
{
connectionStatus = "I have data!";
StateHasChanged();
});
}
}
当我的 HubContext
注入控制器时,它可以工作,但是当它在常规类中时,它不起作用,因为 clients.All
是空的。我该如何解决这个问题?
更新:
我想,我发现了问题。在我的安装程序中,我从 GeneralStockMarketHandler 类创建了一个实例,并调用了一个方法,即 StartToSubscribeAllStocksFromDb。这个方法一开始就得调用一次
services.AddScoped<IGeneralStockMarketHandler,GeneralStockMarketHandler>();
var serviceProvider = services.BuildServiceProvider();
var stockMarketHandler serviceProvider.GetrequiredService<IGeneralStockMarketHandler>();
stockMarketHandler.StartToSubscribeAllStocksFromDb();
如果我不从 GeneralStockMarketHandler 类创建实例,那么我可以获得连接的客户端。
我不明白为什么它会影响逻辑。它不是单例,我只用过一次
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。