使用FindByIdAsync时取消ASP.Net核心标识
我有一个小项目,它使用Asp.Net核心身份框架和EF Core.
一个函数调用UserManager.FindByIdAsync(id)并返回正确的对象.但是,它仅在应用程序启动后的几分钟内工作.只要服务器忙,它就可以正常工作,但只要应用程序空闲超过1-2分钟,请求就会失败. 它失败了: *OperationCanceledException: The operation was canceled. System.Threading.CancellationToken.ThrowOperationCanceledException()* stacktrace看起来像这样: *System.Threading.CancellationToken.ThrowOperationCanceledException() Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore.FindByIdAsync(string userId,CancellationToken cancellationToken) Microsoft.AspNetCore.Identity.UserManager.FindByIdAsync(string userId) MyProject.Areas.Admin.ControllerServices.UserService+<GetUser>d__11.MoveNext() in UserService.cs* 我还在登录,因为其他页面工作正常. 所有这些在开发环境中都很完美,当在WS 2008 R2上运行IIS的服务器上安装应用程序时会发生错误.回收应用程序池将使其再次工作,直到它再次闲置几分钟. 我注意到当’Connection id’0HL5E91K33IIQ“重置”时.正在记录,然后应用程序开始失败.在此之前,它的工作原理. FindByIdAsync不是唯一失败的标识函数,许多其他函数失败并出现相同的错误. 我错过了什么? 解决方法
我将回答我自己的问题,希望这将有助于将来的其他人.
对我来说,这一切都归结为注入服务的生命周期.UserManager依赖于IHttpContextAccessor(这是CancellationToken的来源),并且当生命周期不匹配时它的行为不正确.IHttpContextAccessor作为Singleton服务添加,而UserManager作为作用域服务添加.我使用UserManager的服务被添加为Singleton服务.将此更改为Scoped会使错误消失. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – Asp.Net MVC 3 – @ Html.Action不会呈现
- 从Asp.Net Webforms显示引导模式
- asp.net-mvc – .input-validation-error为表单重新显示失败
- asp.net – Repeater的SeparatorTemplate与Eval
- asp.net-mvc – Asp.net MVC 3验证在TryUpdateModel中排除了
- 身份验证 – 如何使用ASP.NET身份在Web API 2中实现双因素身
- asp.net – 为什么aspnet_compiler.exe这么慢(可以做得更快
- asp.net-mvc – MVC5 – 数据注释 – 客户端验证没有发生?
- 使用IIS调试ASP.NET
- asp.net-mvc – 对于MVC,REST是强制性的吗?