当前位置: 首页 > 编程语言 > C#

在身份框架方法中,HttpContext.Current为空Share

时间:2023-04-10 15:41:21 C#

在身份框架方法中,HttpContext.Current为空我正在使用ASP.NETMVC5和身份框架。当我在ApplicationDbContext()上调用UserManager.UpdateAsync(...)时,我的事件处理程序运行SaveChanges。在这里,我将HttpContext.Current用于不同的目的(日志记录和审计),所以我必须说当前用户。但是整个方法在工作线程中运行,其中HttpContext.Current为空。UserManager的“同步”方法的最大问题只是包装异步版本,因此调用是序列化的,但方法(和事件处理程序)仍在不同的工作线程中运行。请注意,此问题与异步/等待上下文无关。在等待(或调用“同步”版本)之后的控制器中,即使控制器的方法在另一个线程中继续,我也返回了正确的HttpContext。没关系。所以问题出在异步工作者中,它将在“同步”和异步版本中运行。我想我理解这种行为(但我对假的“同步”方法版本不满意,真正的同步方法没有这个问题。)我只是不知道如何处理/解决它。[顺便说一句:将UserManager的操作实现为简单的纯同步版本,然后用异步多线程包装器包装它们不是更自然吗?如果我们不假思索地继续这种异步方式,我们很快就会发明异步赋值运算符。它花费了我几十个小时(就此而言),在全球范围内花费了数十亿美元,而且我相信在许多情况下,得到的回报低于它的价值。奖励:我们所说的UserManager的影响非常小,但是相同的原则和问题可以适用于作者没有实现同步版本或不关心控制器线程的上下文。好吧,EF,它不是那个边缘......像“请求范围”或“会话范围”这样的DI容器实例化基础设施呢?如果在没有HttpContext.Current的线程中进行解析,它们肯定会出现错误。最近我刷新了SendGridNuGet并且(作为重大更改)Deliver()方法消失了,现在只存在DeliverAsync()......我想有一种安全可靠的方法可以访问此worker中的HttpContext以进行日志记录和审计。示例代码,控制器'sync'版本:[AcceptVerbs(HttpVerbs.Post)]publicvirtualActionResultEdit(ApplicationUseruser){//validationetc//Update()似乎只是异步版本的一个糟糕的包装器,仍然使用一个工作线程。varresult=UserManager.Update(用户);//注意:HttpContext在这里是正确的,所以它不是异步/等待问题//错误处理,创建ActionResult等}示例代码,控制器异常版本:[AcceptVerbs(HttpVerbs.Post)]publicvirtualasyncTaskEdit(ApplicationUseruser){//验证等varresult=awaitUserManager.UpdateAsync(user);//注意:HttpContext在这里是正确的,所以它不是异步/等待问题//错误处理,创建ActionResult等初始化审计();}privatevoidInitializeAudit(){varoctx=((IObjectContextAdapter)this).ObjectContext;octx.SavingChanges+=(sender,args)=>{//HttpContext.Currenti这里为null};}有任何想法吗?如您所说,这是因为线程委托在不同的线程中运行,导致无法访问HttpContext。您可以将变量移到委托之外,使其成为闭包。privatevoidInitializeAudit(){varoctx=((IObjectContextAdapter)this).ObjectContext;HttpContext上下文=HttpContext.Current;octx.SavingChanges+=(sender,args)=>{//上下文不为空};您正在传递Owin使用ASP.NET身份,因此每个请求都会创建一个DbContext实例,您可以从请求管道中的任何位置获取对此的引用。注意。这很方便,但我认为不应该在管理器之外访问dbcontext。在asp.net身份设计中,只有经理应该知道商店。我相信dbcontext是公开的,因为有几个asp.net身份中间件依赖于它。但是,它可能会帮助您:允许在类外设置自定义dbcontext处理程序:publicEventHandlerSavingChangesEventHandler{set{声明自定义ActionFilter类并注册它,然后重写OnActionExecuting:在ASP.NETMVC中过滤https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx{publicoverridevoidOnActionExecuting(HttpActionContextactionContext){vardbcontext=HttpContext.GetOwinContext().Get();varcurrentuser=HttpContext.Current.User;dbcontext.SavingChangesEvent=Handlerarg={s)当前用户};您可能需要这些using语句才能调用identity.owin扩展方法:usingMicrosoft.AspNet.Identity;使用Microsoft.AspNet.Identity.Owin;您应该在控制器线程中,因为OnActionExecuting正在包装控制器操作。我没有测试它,所以它可能需要一些润色,但这个概念应该可行。以上是C#学习教程:IdentityFramework的方法中,HttpContext.Current为null,分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: