asp.net core mvc 在中间件中使用依赖注入问题:System.InvalidOperationException: Cannot resolve scoped service 'IXXX...

在尝试使用ASP.NET Core MVC实现JWT用户验证时遇到错误:System.InvalidOperationException,提示无法从根提供者解析作用域服务'IXXXService'。错误指出对象已被释放。解决方案包括正确注册服务,定义中间件和入口,并遵循中间件生命周期规则,确保其在适当的作用域内使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在弄JWT的时候需要用到用户验证使用一个自己写好的验证,但在出现了:System.InvalidOperationException: Cannot resolve scoped service 'IXXXService' from root provider.

说的是被释放掉了:

Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.

直接上解决方法:

1、注册你的服务

public void ConfigureServices(IServiceCollection services)
{
  /* 注册服务 AddServices注册了IUsersService*/
  services.AddServices();
}

2、定义中间件和入口

public static class TokenProviderExtensions
    {
        public static IApplicationBuilder UseAuthentication(this IApplicationBuilder app, TokenProviderOptions options)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }
            return app.UseMiddleware<TokenProviderMiddleware>(Options.Create(options));
        }
    }
//TokenProviderMiddleware 里面的 Invoke 里面去用就没问题了

public
async Task Invoke(HttpContext context, IUsersService usersService) { /* usersService 可以用了 */ await _next(context); }

3、

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    /*上面扩展的 UseAuthentication */ 
app.UseAuthentication();
}

 

看了文档大概用是这个意思:

中间件在构造器中必须是singleton-lifetime.

如果接受Invoke就可以是singleton-lifetime or
scoped-lifetime.

转载于:https://www.cnblogs.com/huangyoum/p/7802352.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值