【问题标题】:null HttpContext inside SendAsync method of IIdentityMessageServiceIIdentityMessageService 的 SendAsync 方法中的 null HttpContext
【发布时间】:2014-10-09 08:21:55
【问题描述】:

在我尝试升级到 ASP.NET Identity 之前,我有一段非常简单的代码使用。这是一个真正令人头疼的问题。 将 ASP.NET MVC 5 与 ASP.NET Identity 2.1 结合使用(在撰写本文时是最新最好的) 我有一个“用户忘记了他们的电子邮件”控制器操作:

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

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

截至今天,在我的方法中抛出了一个异常,因为正在呈现电子邮件,告诉我我没有活动的 Http 上下文。当然,HttpContext.Current 为空。在控制器操作中调用SendEmailAsync 时它为null,在任务继续中的await 之后它不为null,但在SendEmailAsync 中它为null。

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

我有一个丑陋的“修复”,我在创建 IdentityMessageService 时将 HttpContext.Current 保存到本地 var,并在 SendAsync 执行时将当前 HttpContext 设置为该值,这可行,但这肯定闻起来很严重ASP.NET 堆栈内的回归,某处。

有没有人遇到过类似的情况?

【问题讨论】:

  • “web.config 中的正确标志”到底是什么意思?
  • 哎呀 - 所以吃了我的格式。正在谈论启用“友好”任务调度程序的 标志。

标签: asp.net asp.net-mvc asp.net-identity


【解决方案1】:

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

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

Install-Package RazorEngine

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2017-11-24
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2015-03-29
    相关资源
    最近更新 更多