--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
里面你那里有很多#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 在哪里被注入/解析,它与其他似乎有效的服务有何不同?