在IIdentityMessageService的SendAsync方法中使用null HttpContext

时间:2014-08-15 15:17:37

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

在尝试升级到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,在任务延续中等待之后它不为空,但它为null在SendEmailAsync内。

我使用了正确的<system.web><httpRuntime targetFramework="4.5.1" /></system.web> web.config里面的标志,一切都在书中。现在,在更新某些组件之后 - 无论它是一个次要的ASP.NET MVC版本还是ASP.NET身份版本 - 我都不知道 - HttpContext.Current为空。

我有一个丑陋的&#34;修复&#34;我在创建IdentityMessageService时将HttpContext.Current保存到本地var,并在SendAsync执行时将当前HttpContext设置为该值,这有效,但这绝对闻起来像ASP.NET堆栈中的一个非常严重的回归,某处。

有没有人遇到类似的东西?

1 个答案:

答案 0 :(得分:0)

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

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

获得
Install-Package RazorEngine

根据documentation判断它很容易使用。我自己从未使用过它,因此无法超越这些网页所说的内容。