当我试图在也使用Mvc.Unity4的MVC应用程序中使用Postal时,我遇到了一个奇怪的问题。
我认为这个问题是由于无法访问HttpContext而引发的。
我尝试使用Postal从我的一个控制器内部发送电子邮件:
dynamic e = new Email("AccountActivation");
e.To = "name@email.com"
e.Send();尝试发送电子邮件会导致Unity.Mvc4.UnityDependencyResolver中出现以下异常
[NullReferenceException: Object reference not set to an instance of an object.]
Unity.Mvc4.UnityDependencyResolver.get_ChildContainer() +57
Unity.Mvc4.UnityDependencyResolver.GetService(Type serviceType) +241
System.Web.Mvc.DefaultViewPageActivator.Create(ControllerContext controllerContext, Type type) +87
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +216
Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder) +182
Postal.EmailViewRenderer.Render(Email email, String viewName) +204
Postal.EmailService.CreateMailMessage(Email email) +72
Postal.EmailService.Send(Email email) +65我不太熟悉Mvc.Unity4,因为它是由不同的开发人员添加的。
我试着在Application_Start中注册正确的Postal类型。统一容器的初始化在Bootstrapper.cs中进行:
container.RegisterType<UsersController>(new InjectionConstructor());
container.RegisterInstance<IEmailService>(new EmailService());在我的控制器中,我有:
private IEmailService _emailService;
public UsersController()
{
_emailService = new Postal.EmailService();
}
public UsersController(Postal.EmailService emailService)
{
_emailService = emailService;
}
[HttpPost]
public async Task<ActionResult> SendEmail(EmailViewModel viewModel)
{
dynamic e = new Email("AccountActivation");
e.ViewData.Add("To", "name@email.com");
e.ViewData.Add("From", "no-reply@email.com");
_emailService.Send(e);
More code...
}发布于 2015-02-06 04:02:44
我认为你的怀疑是对的。HttpContext在应用程序初始化期间不可用。因此,Postal不会在Application_Start事件中工作(因为它依赖于ControllerContext和ViewContext)。
由于您使用的是DI,这也扩展到使用Unity配置的每个类的构造函数-您不能在构造函数中使用Postal,但可以在Application_Start完成后调用的方法中使用Postal。
在这种情况下,您需要将对Postal的调用移到Application_Start之外,或者使用原生.NET邮件库(因为它们依赖于System.Net,而不依赖于HttpContext)。
发布于 2015-02-09 01:03:39
很抱歉回答我自己的问题,但我终于能够让它工作了。
一旦我从方法中删除了async,一切都开始正常工作。
通过改变..。
public async Task<ActionResult> SendEmail(EmailViewModel viewModel)对这个..。
public ActionResult SendEmail(EmailViewModel viewModel)然后我就可以在不触发Unity.Mvc4.UnityDependencyResolver.get_ChildContainer()内部异常的情况下发送电子邮件了。
我不确定为什么我不能从async方法中调用Postal的.Send() (顺便说一下,我尝试调用.SendAsync()时也出现了相同的Unity问题)。如果有人能解释为什么这可以在async方法中工作,我们将不胜感激。
谢谢。
https://stackoverflow.com/questions/28352164
复制相似问题