IHttpContextAccessor 在一个存储库中为空

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

--dotnet7-- 我正在尝试使用 HttpContextAcessor 从标头中的令牌获取我的用户 ID,我在 Program.cs 中注册了我的存储库和 HttpContextAcessor

builder.Services.AddScoped<IWardrobeService, WardobreService>();
builder.Services.AddScoped<IGuildService, GuildService>();
builder.Services.AddHttpContextAccessor();

WardrobeService 内,我可以使用访问器并返回 id。
WardrobeService.cs:

private readonly DataContext _context;
private readonly IMapper _mapper;
private readonly IEffectService _fxService;
private readonly IHttpContextAccessor _httpContext;
private readonly IDMService _dmService;
public WardobreService(DataContext context, IMapper mapper, IEffectService fxService, IHttpContextAccessor httpContext, IDMService dmService)
{   
    _context = context;
    _mapper = mapper;
    _fxService = fxService;
    _httpContext = httpContext;
    _dmService = dmService;
}
// Needed Methods
private int GetCurrentUserId() => int.Parse(
    _httpContext.HttpContext!.User.FindFirstValue(ClaimTypes.NameIdentifier)!
);

但是如果我在 GuildService 中尝试这个,访问器总是返回 null。
GuildService.cs:

private readonly IMapper _mapper;
private readonly DataContext _context;
private readonly IHttpContextAccessor _httpContext;
private readonly IWardrobeService _wardrobe;
public GuildService(IMapper mapper, DataContext context, IHttpContextAccessor httpContext, IWardrobeService wardrobe)
{
    _context = context;
    _mapper = mapper;
    _httpContext = httpContext;
    _wardrobe = wardrobe;
}
// Needed Methods
private int GetCurrentUserId() => int.Parse(
    _httpContext.HttpContext!.User.FindFirstValue(ClaimTypes.NameIdentifier)!
);
private async Task<Character> GetCurrentCharacter()
{
    var c = await _context.Characters.FirstOrDefaultAsync(c => c.UserId == GetCurrentUserId());
    return c!;
}

在这里,当我尝试使用 GetCurrentCharacter() 时,出现错误,因为 GetCurrentUserId() 返回 null。 据我所知,我在两个存储库中做了同样的事情,我不明白为什么 _httpContext.HttpContext 总是返回 null.

我尝试重写GuildService,没有用。我尝试在 GuildService 中调用 _wadrobeService;如果我这样做,那么问题就会发生在WardrobeService

里面
.net entity-framework dependency-injection .net-7.0
1个回答
0
投票

你那里有很多#null 宽恕。分解并检查。

private int GetCurrentUserId() 
{
    var user = _httpContext.HttpContext?.User;
    if(user == null) 
        throw new ApplicationException("No user session");

    var name = user.FindFirstValue(ClaimTypes.NameIdentifier);
    if (string.IsNullOrEmpty(name))
        throw new ApplicationException("No user name claim.");

    var result = int.TryParse(name, out int userId)
    if (!result)
        throw new ApplicationException("User name claim not a User ID.");

    return userId;
}

在无法检索用户会话状态的所有情况下,应转储整个会话,迫使用户重新进行身份验证。分解它以查看实际设置(或未设置)的内容应该有助于缩小问题范围。

要检查的区域是查看调用堆栈,了解在整个请求中调用此特定存储库的位置/时间。如果它在不在 Http 请求范围内时以某种方式被调用,则上下文访问器可能无法解析当前会话。这个 GuildService 在哪里被注入/解析,它与其他似乎有效的服务有何不同?

© www.soinside.com 2019 - 2024. All rights reserved.