簡體   English   中英

在asp.net核心Web API上使用Autofac在同一存儲庫上發生多個http請求時發生錯誤

[英]error when multiple http request happens on the same repository with Autofac on asp.net core web api

我收到此錯誤:

嘗試在配置上下文時使用上下文。 無法在OnConfiguring內部使用DbContext實例,因為此時仍在對其進行配置。

盡管信息很明確,但是我嘗試了很多不同的嘗試,但是沒有運氣。 如果我從前端應用程序運行單個HTTP請求,則一切正常。 但是,當兩個HTTP調用並行運行並且都需要TokenRepository時,會發生上述錯誤。

我想念什么?

碼:

public class TokenRepository : BaseRepository<Token>, ITokenRepository
{
    public TokenRepository(DataContext dataContext) : base(dataContext)
    {

    }

    public async Task<Token> GetByTokenValue(string tokenValue)
    {
    // this is where the ERROR happens
        return await this._dataContext
            .Set<Token>()
            .FirstOrDefaultAsync(f => f.TokenValue == tokenValue);
    }
 }

啟動:

//setup Authorization
        services.AddAuthorization(options =>
        {
            options.AddPolicy(Global.CustomAuthorization,
                policy => policy.AddRequirements(new CustomAuthorizationRequirement()));
        });
        services.AddSingleton<IAuthorizationHandler, CustomAuthorizationHandler>();

        // Create the Autofac container builder.
        var builder = new ContainerBuilder();

        // Add any Autofac modules or registrations.
        builder.RegisterModule(new AutoFacModule());

        // Populate the services.
        builder.Populate(services);

        // Build the container.
        this.ApplicationContainer = builder.Build();

        // Create and return the service provider.
        return new AutofacServiceProvider(this.ApplicationContainer);

Autofac:

builder.RegisterType<DataContext>().AsSelf().InstancePerLifetimeScope();

        builder.RegisterGeneric(typeof(Repositories.Repos.BaseRepository<>)).As(typeof(IBaseRepository<>));
        builder.RegisterType<Repositories.Repos.HomeRepository>().As<IHomeRepository>();
        builder.RegisterType<Repositories.Repos.ContactRepository>().As<IContactRepository>();
        builder.RegisterType<Repositories.Repos.AccountRepository>().As<IAccountRepository>();
        builder.RegisterType<Repositories.Repos.TokenRepository>().As<ITokenRepository>();
        builder.RegisterType<Repositories.Repos.SanctuaryRepository>().As<ISanctuaryRepository>();


        //Services
        builder.RegisterGeneric(typeof(BaseService<,>)).As(typeof(IBaseService<,>));
        builder.RegisterType<HomeService>().As<IHomeService>();
        builder.RegisterType<ContactService>().As<IContactService>();
        builder.RegisterType<AccountService>().As<IAccountService>();
        builder.RegisterType<TokenService>().As<ITokenService>();
        builder.RegisterType<EmailService>().As<IEmailService>();
        builder.RegisterType<SanctuaryService>().As<ISanctuaryService>();

        //Dtos
        builder.RegisterType<HomeDto>().As<IBaseDto<HomeModel, HomeDto>>();
        builder.RegisterType<ContactDto>().As<IBaseDto<ContactModel, ContactDto>>();
        builder.RegisterType<AccountDto>().As<IBaseDto<Account, AccountDto>>();
        builder.RegisterType<TokenDto>().As<IBaseDto<Token, TokenDto>>();
        builder.RegisterType<PasswordRecoveryDto>().As<IBaseDto<PasswordRecovery, PasswordRecoveryDto>>();
        builder.RegisterType<ChangePasswordDto>().As<IBaseDto<Token, TokenDto>>();
        builder.RegisterType<SanctuaryDto>().As<IBaseDto<Domain.Entities.Sanctuary, SanctuaryDto>>();

        base.Load(builder);

授權

public class CustomAuthorizationHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{
    private IAccountService _accountService;
    private ITokenService _tokenService;

    protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
    {
        var httpContext = (context.Resource as AuthorizationFilterContext).HttpContext;
        this._accountService = httpContext.RequestServices.GetService(typeof(IAccountService)) as IAccountService;
        this._tokenService = httpContext.RequestServices.GetService(typeof(ITokenService)) as ITokenService;


        StringValues authHeader;

        httpContext.Request.Headers.TryGetValue("Authorization", out authHeader);
    }
}

好的,我的CustomAuthorization似乎正在請求尚未注冊的服務(?)。 但是,如果我嘗試先注冊服務,則會收到另一個錯誤消息,提示它找不到CustomAuthorization

從我的角度來看,在多個請求中使用相同的DataContext存在一個問題。 您應該考慮案例中DataContext的生命周期。 在Singleton中使用此存儲庫可能存在問題(也許在CustomAuthorizationHandler中?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM