asp.net 对依赖于AuthenticationStateProvider的服务使用AddSingleton时出现错误“在SetAuthenticationState之前调用了GetAuthenticationStateAsync

fdx2calv  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(131)

我有一个依赖于AuthenticationStateProvider的服务。如果我使用AddScoped添加我的服务,它可以正常工作,如果我使用AddSingleton添加,当我的服务调用AuthenticationStateProvider的GetAuthenticationStateAsync方法时,我将收到异常。
在设置验证状态之前调用了获取验证状态异步。
我理解范围上的不同,但我不明白为什么id会对AuthenticationStateProvider产生影响。
我的服务:

public class MyService : IMyService
{
    AuthenticationStateProvider _provider
    public MyService(AuthenticationStateProvider provider)
    {
        _provider = provider
    }

    public async Task<MyObject> DoThingsAsyc()
    {
        \\Exception happens here
        var user = (await _provider.GetAuthenticationStateAsync()).User;
        ...
    }
}

Program.cs:

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IMyService, MyService>();
2g32fytz

2g32fytz1#

当我们有一个作用域示例时,每次加载页面时,都会创建一个新的AuthenticationStateProvider示例并插入到MyService中。然而,当我们执行单例时,它会保持完全相同的示例(包括相同的AuthenticationStateProvider服务)。当我们将MyService设为单例时,这意味着无法在每次页面加载时创建AuthenticationStateProvider服务。
我们无法使用生存期较短的服务。作用域服务仅存在于每个请求中,而单例服务创建一次并共享示例。现在,应用中仅存在MyService的一个示例。但它希望依赖AuthenticationStateProvider,该示例是作用域的,并且是按请求创建的。尚未创建AuthenticationStateProvider服务,因此没有SetAuthenticationState。在MyService中,您使用_provider.GetAuthenticationStateAsync()在SetAuthenticationState之前调用GetAuthenticationStateAsync。因此,错误将继续。

相关问题