如何在Blazor Server组件中获取当前电路ID?

4

我正在尝试为我的应用程序添加更详细的错误日志记录,以便在电路崩溃时记录当前页面的URL。一种方法是在自定义CircuitHandler中覆盖OnCircuitClosedAsync方法,但是我不知道如何将电路ID字符串与活动用户会话相关联。

我知道可以通过注入IHttpContextAccessor(请参见此答案)在CircuitHandler中跟踪用户,但是一个用户可能有多个打开的选项卡,甚至可能有多个并发登录会话,我需要确切地知道每个页面组件分配给哪个电路ID。

是否有办法从Blazor组件中获取当前电路ID,即使同一用户有多个选项卡打开(即与其帐户关联的多个电路)?

1个回答

3

实现一个作用域限定的 CircuitHandler

在重写的 OnCircuitOpenedAsync 方法中,将 Circuit 存储到应用程序状态中。

在组件中,从您的应用程序状态中获取 Circuit。

以下是一个基本的最小示例:

CircuitHandler

using Microsoft.AspNetCore.Components.Server.Circuits;

internal class MyCircuitHandler : CircuitHandler
{
  private IMyCircuit myCircuit;

  public MyCircuitHandler(IMyCircuit myCircuit)
  {
    this.myCircuit = myCircuit;
  }
  public override Task OnCircuitOpenedAsync(Circuit circuit, CancellationToken cancellationToken)
  {
    myCircuit.CurrentCircuit = circuit;
    return base.OnCircuitOpenedAsync(circuit, cancellationToken);
  }
}

应用状态


internal interface IMyCircuit
{
  Circuit CurrentCircuit { get; set; }
}

internal class MyCircuit : IMyCircuit
{
  public Circuit? CurrentCircuit { get; set; }  
}

Program.cs

builder.Services.AddScoped<IMyCircuit, MyCircuit>();
builder.Services.AddScoped<CircuitHandler, MyCircuitHandler>();

Index.razor

@page "/"
@inject IMyCircuit circuit

<h1>Circuit: @circuit?.CurrentCircuit?.Id</h1>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接