大佬教程收集整理的这篇文章主要介绍了.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,请注明来意。