gpt4 book ai didi

asp.net - IIdentityMessageService 的 SendAsync 方法内的 null HttpContext

转载 作者:行者123 更新时间:2023-12-02 16:54:01 25 4
gpt4 key购买 nike

在我尝试升级到 ASP.NET Identity 之前,我有一段非常简单的代码用来工作。这真是令人头疼。将 ASP.NET MVC 5 与 ASP.NET Identity 2.1 结合使用(撰写本文时最新且最出色的版本)我有一个“用户忘记了他们的电子邮件” Controller 操作,可以执行以下操作:

await this.UserManager.SendEmailAsync(
user.Id,
AccountStrings.ForgotPasswordEmailTitle,
string.Format(AccountStrings.ForgotPasswordEmailMessage, callbackUrl));

我的用户管理器使用 IIdentityMessageService 的实现发送电子邮件,我的代码位于 Task SendAsync(IdentityMessage message) 。在该方法中,我需要一个事件的 Http 上下文,因为我使用 Razor View 引擎来构建电子邮件。再说一遍,这曾经有效,直到今天。

截至今天,当呈现电子邮件时,我的方法中会引发异常,告诉我没有事件的 Http 上下文。当然,HttpContext.Current一片空白。当 SendEmailAsync 时,它为空。在 Controller 操作内部调用,在任务延续中的await之后它不为空,但在SendEmailAsync内部为空。

我使用的是正确的<system.web><httpRuntime targetFramework="4.5.1" /></system.web>web.config 中的标志,一切都是按书本进行的。现在,更新一些组件后 - 无论是次要 ASP.NET MVC 版本还是 ASP.NET Identity 版本 - 我不知道 - HttpContext.Current一片空白。

我有一个丑陋的“修复”,我在创建 IdentityMessageService 时将 HttpContext.Current 保存到本地变量,并在执行 SendAsync 时将当前 HttpContext 设置为该值,这可以工作,但这绝对闻起来非常严重ASP.NET 堆栈内部某处的回归。

有人遇到过类似的事情吗?

最佳答案

我还没有遇到这个确切的问题,但我的直觉说 HttpContext.Current 不应该在 SendEmailAsync 内部使用,这不是一个错误,而是有意的实现在身份框架方面。我猜测创建一个全新的线程只是为了发送电子邮件,并且该线程无法访问 HttpContext.Current,即该线程不依赖于 Http 请求/响应。

所以我的想法是将电子邮件生成与 HttpContext 分离。为了帮助您做到这一点,有一个 RazorEngine允许使用 Razor View 但没有 HttpContext 的项目。该项目可通过 nuget 获取:

Install-Package RazorEngine

documentation 来看它很容易使用。但我自己从未使用过它,所以不能超出这些网页所说的内容。

关于asp.net - IIdentityMessageService 的 SendAsync 方法内的 null HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com