📅  最后修改于: 2023-12-03 14:51:29.439000             🧑  作者: Mango
当开发ASP.NET Core应用程序时,获取有关当前用户的信息对于许多应用程序都是至关重要的。常见的做法是在构造函数中调用HttpContext
以获取当前用户,但是在OnInitialized
方法中调用AuthenticationStateProvider.GetAuthenticationStateAsync()
获取当前用户也是可行的。
在构造函数中调用当前用户比在OnInit
方法中调用更加直接,因为可以直接在构造函数中获取到HttpContext
。但是,在构造函数中获取当前用户也有一些缺点。
第一点,在构造函数调用HttpContext
时可能会发生异常。如果此时HttpContext
为null
,则会抛出NullReferenceException
异常。您可以使用RequestServices
来获取它,但是这也可能引发异常。
第二点,在构造函数中调用HttpContext
可能会导致单元测试运行失败。这是因为单元测试框架通常不会为您创建完整的HttpContext
。该问题通常可以通过将依赖项注入到构造函数中而不是调用HttpContext
来解决。
public class MyComponent : ComponentBase
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyComponent(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override void OnInitialized()
{
// This will work for both server-side rendering and Blazor WASM
var user = _httpContextAccessor.HttpContext?.User;
// ...
}
}
在OnInitialized
方法中调用AuthenticationStateProvider.GetAuthenticationStateAsync()
可以确保您获取到的是最新的身份验证状态。这是因为在首次加载组件时和每次发生身份验证状态更改时,都会调用OnInitialized
。
使用AuthenticationStateProvider.GetAuthenticationStateAsync()
在 Blazor WebAssembly中获取当前用户的位置
public class MyComponent : ComponentBase
{
[Inject] private AuthenticationStateProvider AuthenticationStateProvider { get; set; }
protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
// ...
}
}
在 Blazor Server中获取当前用户的位置:
public class MyComponent : ComponentBase
{
[Inject] private AuthenticationStateProvider AuthenticationStateProvider { get; set; }
protected override async Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
// ...
}
}
总之,在构造函数和OnInitialized
中获取当前用户各有优缺点。在构造函数中获取当前用户更直接,但也可能会导致单元测试失败。在OnInitialized
中调用AuthenticationStateProvider.GetAuthenticationStateAsync()
则会确保获取到的是最新的身份验证状态。根据实际情况选择最适合您的方法即可。