![](/img/trans.png)
[英]HTTP Error 404 when trying to access endpoint of ASP.NET core Web API
[英]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.