zoukankan      html  css  js  c++  java
  • asp.net core mvc 在中间件中使用依赖注入问题:System.InvalidOperationException: Cannot resolve scoped service 'IXXXService' from root provider.

    今天在弄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.

  • 相关阅读:
    缓存穿透、缓存雪崩、缓存击穿的区别和解决方案
    图解“红黑树”原理,一看就明白!
    Linux系统中常见文件系统格式
    Maven 加载ojdbc14.jar报错,解决方法
    mybatis中#{}和${}的区别
    SqlServer 分页批按时间排序
    Centos7安装与配置domain模式wildfly(默认配置)
    通过java调用Http接口上传图片到服务器
    Spring boot 配置array,list,map
    idea+springboot+freemarker热部署
  • 原文地址:https://www.cnblogs.com/huangyoum/p/7802352.html
Copyright © 2011-2022 走看看