如何获取 Blazor 服务器组件中的当前电路 ID?

Láz*_*olt 6 c# blazor blazor-server-side

我正在尝试向我的应用程序添加更详细的错误日志记录,以便在电路崩溃时记录当前页面 url。执行此操作的一种方法是重写OnCircuitClosedAsynccustom 中的方法CircuitHandler,但是我不知道如何将电路 id 字符串与活动用户会话关联起来。

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

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

Mis*_*goo 5

实施有范围的CircuitHandler.

OnCircuitOpenedAsync覆盖中,将电路存储在应用程序状态。

在组件中,从应用程序状态获取电路。

这是一个基本的最小示例:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

应用程序状态


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

internal class MyCircuit : IMyCircuit
{
  public Circuit? CurrentCircuit { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

程序.cs

builder.Services.AddScoped<IMyCircuit, MyCircuit>();
builder.Services.AddScoped<CircuitHandler, MyCircuitHandler>();
Run Code Online (Sandbox Code Playgroud)

索引剃刀

@page "/"
@inject IMyCircuit circuit

<h1>Circuit: @circuit?.CurrentCircuit?.Id</h1>
Run Code Online (Sandbox Code Playgroud)