程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例?

开发过程中遇到.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例的问题如何解决?下面主要结合日常开发的经验,给出你关于.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例的解决方法建议,希望对你解决.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例有所启发或帮助;

这是我的代码

我可能知道为什么,但我不知道如何

我知道将dbcontext设置为singleton可以解决这个问题,但是好像副作用很多

我不想那样。还有什么办法

这是中间件的一些代码。

中间件如下:

@H_772_15@ public class JwtMIDdleware
{
    private Readonly requestDelegate _next;
    private Readonly AppSetTings _appSetTings;

    public JwtMIDdleware(requestDelegate next,IOptions<AppSetTings> appSetTings)
    {
        _next = next;
        _appSetTings = appSetTings.Value;
    }

    public async Task Invoke(httpContext context,IUserservice userservicE)
    {
        var token = context.request.headers["Authorization"].FirstOrDefault()?.Split(" ").Last();

        if (token != null)
            attachUserToContext(context,userservice,token);

        await _next(context);
    }

    private voID attachUserToContext(httpContext context,IUserservice userservice,String token)
    {
        try
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = EnCoding.ASCII.GetBytes(_appSetTings.SecretKey);
            tokenHandler.ValIDatetoken(token,new TokenValIDationParameters
            {
                ValIDateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(key),ValIDateIssuer = false,ValIDateAudIEnce = false,// 将ClockSkew设置为零,以便令牌正好在令牌过期时过期(而不是5分钟后)
                ClockSkew = TimeSpan.Zero
            },out SecurityToken valIDatedToken);

            var jwtToken = (JwtSecurityToken)valIDatedToken;
            var userID = jwtToken.Claims.First(x => x.Type == "ID").Value;

            // 在jwt验证成功时将用户附加到上下文
            context.Items["User"] = userservice.GetByIDAsync(userID);
        }
        catch
        {
            // do nothing if jwt valIDation fails
            // user is not attached to context so request won't have access to secure routes
        }
    }
}

Userservice 如下:

@H_772_15@ public interface IUserservice
{
    Task<AuthenticateResponse> Authenticate(LoginDto model);
    Task<IDentityUser> GetByIDAsync(String userID);
}

public class Userservice : IUserservice
{
    private Readonly UseRMANager<IDentityUser> _useRMANager;
    public AppSetTings _JwtSetTings { get; }

    public Userservice(UseRMANager<IDentityUser> useRMANager,IOptions<AppSetTings> jwtSetTings)
    {
        this._useRMANager = useRMANager;
        this._JwtSetTings = jwtSetTings.Value;
    }

    /// <sumMary>
    /// 进行身份验证
    /// </sumMary>
    /// <param name="model">LoginDto模型</param>
    /// <returns>AuthenticateResponse</returns>
    public async Task<AuthenticateResponse> Authenticate(LoginDto model)
    {
        var user = await _useRMANager.FindBynameAsync(model.UserName);

        // 没用用户或密码错误返回null
        if (user == null && !await _useRMANager.checkpasswordAsync(user,model.password)) return null;

        // 验证成功 生成jwt令牌
        var token = generateJwtToken(user);

        return new AuthenticateResponse(user,token);
    }

    //获取Jwt Token
    private String generateJwtToken(IDentityUser user)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIDentity(new[] {
                new Claim(JwtClaimTypes.AudIEnce,_JwtSetTings.AudIEncE),new Claim(JwtClaimTypes.Issuer,_JwtSetTings.Issuer),new Claim(JwtClaimTypes.name,user.UserName),new Claim(JwtClaimTypes.ID,user.ID.ToString()),}),Expires = datetiR_827_11845@e.UtcNow.AddDays(1),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(EnCoding.UTF8.GetBytes(_JwtSetTings.SecretKey)),SecurityAlgorithms.HmacSha256SignaturE)
        };
        var token = tokenHandler.Createtoken(tokenDescriptor);
        return tokenHandler.Writetoken(token);
    }

    public async Task<IDentityUser> GetByIDAsync(String ID)
    {
        var user = await _useRMANager.FindByIDAsync(ID);
        return user;
    }
}

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例全部内容,希望文章能够帮你解决.Net 核心中间件 System.ObjectDisposedException:无法访问已处理的上下文实例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: