微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我在 ASP.NET Core 中使用非控制器类时,SignalR 的客户端列表为空

如何解决当我在 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);
     }
}

我注入 GeneralStockMarketHandlerIHubContext 类:

 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 举报,一经查实,本站将立刻删除。