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.

  • 相关阅读:
    python基础--(hashlib,configparser,logging)模块功能
    java发送邮件
    Struts2和SpringMVC的action是单例还是原型的?
    HashSet存储过程中如何排除不同的自定义对象?
    使用win32Diskimager后恢复U盘(合并U盘容量)
    linux进程与端口
    centos 7.6 忘记root密码
    Authentication token is no longer valid; new one required You (oracle) are not allowed to access to (crontab) because of pam configuration.
    存储过程
    oracle extract()函数
  • 原文地址:https://www.cnblogs.com/huangyoum/p/7802352.html
Copyright © 2011-2022 走看看