获取所有已连接到 Blazor 应用程序的用户的列表

问题描述 投票:0回答:1

因此,我的 blazor 应用程序目前正在生产中。

我确实需要在某些时候发布新版本。 我想知道当时是否有人在使用该应用程序。 为此,我可以询问每个人(大约 20 名同事)是否有人在使用该应用程序。

我觉得应该有一种更简单的方法来做到这一点。 现在我知道 blazor 应用程序使用 SignalR 来执行服务器和客户端之间的通信,并且当我重新启动 docker 容器时,所有连接都会重置。所以我觉得应该有一种方法可以从 SignalR Hub 请求是否有人连接到应用程序,但我还没有找到方法。

有谁知道有什么方法可以检查是否(以及谁)在 x 点及时使用该应用程序?

c# blazor signalr blazor-server-side
1个回答
5
投票

最简单的方法是使用依赖注入。在 Blazor 服务器上,scoped,几乎意味着 “通过连接实现一个实例”:

Blazor Server 托管模型支持跨 HTTP 请求的作用域生命周期,但不支持跨客户端加载的组件之间的 SignalR 连接/电路消息。应用程序的 Razor Pages 或 MVC 部分正常处理作用域服务,并在页面或视图之间导航或从页面或视图导航到组件时在每个 HTTP 请求上重新创建服务。在客户端上的组件之间导航时,不会重构作用域服务,其中与服务器的通信通过用户电路的 SignalR 连接进行,而不是通过 HTTP 请求。在客户端的以下组件场景中,由于为用户创建了新的线路,因此会重构作用域服务:

  • 用户关闭浏览器窗口。用户打开一个新窗口并导航回应用程序。
  • 用户在浏览器窗口中关闭应用程序的选项卡。用户打开一个新选项卡并导航回应用程序。
  • 用户选择浏览器的重新加载/刷新按钮。

过程非常简单:

创建类来存储

ConnectedUser
数据和
ConnectedUserList
:

public class ConnectedUser
{
    public string Name { get; set; } = Guid.NewGuid().ToString();
}
public class ConnectedUserList
{
    public List<ConnectedUser> Users { get; set; } = new();
}

program.cs
上,在服务上注入两个类:
ConnectedUser
(作用域)和
ConnectedUserList
(单例),其中将包含
ConnectedUser
的列表。

// Program.cs
builder.Services.AddScoped<ConnectedUser>();
builder.Services.AddSingleton<ConnectedUserList>();

Shared/MainLayout.razor
上,通过注入获取两个对象并将
ConnectedUser
添加到
ConnectedUserList
(在登录过程或事件中,您可以将
ConnectedUser.Username
更新为登录的用户名)

@implements IDisposable
@inject ConnectedUser _ConnectedUser
@inject ConnectedUserList _ConnectedUserList

@code {

    protected override void OnInitialized()
    {
         _ConnectedUserList.Add(_ConnectedUser )
    }

    // Don't forget to remove `ConnectedUser` from 
    // `ConnectedUserList` on dispose.
    public override void Dispose()
    {
         _ConnectedUserList.Remove(_ConnectedUser )
    }

您随时可以获取

ConnectedUserList
并查看列表。例如
index.razor

@page "/"

@inject ConnectedUser _ConnectedUser
@inject ConnectedUserList _ConnectedUserList

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

@foreach (var user in _ConnectedUserList.Users)
{
    <p>@user.Name</p>
}
© www.soinside.com 2019 - 2024. All rights reserved.