我有一个非常简单的代码,使用工作之前,我试图升级到ASP。净的身份。这真是个令人头疼的问题。使用ASP。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
中它是null。
我使用正确的<system.web><httpRuntime targetFramework="4.5.1" /></system.web>
网页内的标志。Config,一切照章办事。现在,在更新了一些组件之后——不管它是一个小的ASP。. NET MVC版本或ASP。. NET身份版本-我不知道- HttpContext.Current
是空的。
我有一个丑陋的"修复",我保存HttpContext。当我的IdentityMessageService被创建时,当前到一个本地变量,并在SendAsync执行时将当前的HttpContext设置为该值,这是有效的,但这绝对像ASP内部的一个相当严重的回归。. NET栈,在某个地方。
有人遇到过类似的事情吗?
我没有遇到这个确切的问题,但我的直觉说HttpContext.Current
不应该在SendEmailAsync
内使用,这不是一个bug,而是身份框架部分的故意实现。我猜,一个全新的线程被创建只是为了发送电子邮件,这个线程没有访问HttpContext。当前,即此线程不依赖于Http请求/响应。
所以我的想法是从HttpContext解耦你的电子邮件生成。为了帮助你做到这一点,有一个RazorEngine项目,允许与Razor视图一起工作,但没有HttpContext。这个项目可以通过nuget:
Install-Package RazorEngine
从文档来看,它很容易使用。我自己从来没用过,所以不能超越这些网页所说的。