IIdentityMessageService的SendAsync方法中的HttpContext



我有一个非常简单的代码,使用工作之前,我试图升级到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

从文档来看,它很容易使用。我自己从来没用过,所以不能超越这些网页所说的。

相关内容

  • 没有找到相关文章

最新更新