【问题标题】:Receiving "Value cannot be null. Parameter name: httpContext" when sending MVC Mailer email from ASP MVC从 ASP MVC 发送 MVC Mailer 电子邮件时收到“值不能为空。参数名称:httpContext”
【发布时间】:2018-05-18 04:59:45
【问题描述】:

当我从服务器发送邮件时,我的 MVC Mailer 实例失败。我在尝试发送电子邮件时收到错误 Value cannot be null.Parameter name: httpContext

我的代码如下所示:

    public static void SendApproval(TimeOffRequest request)
    {
        MailService mailer = new MailService();
        mailer.ViewData.Model = request;

        MvcMailMessage mailMessage = new MvcMailMessage
        {
            Subject = $"PTO request approved for {request.StartTime} to {request.EndTime}",
            From = new MailAddress("calendar@company.com"),
        };
        mailMessage.To.Add(new MailAddress(request.Requester.Email));

        if (mailMessage.To.Count == 0)
            return;

        mailer.PopulateBody(mailMessage, "RequestApproved");
        mailMessage.Send();
    }

mailer.PopulateBody(mailMessage, "RequestApproved");线上特别失败

它是从控制器端点的帖子中调用的。为什么在这种情况下缺少上下文?我尝试手动传递上下文,但也失败了。

这是堆栈跟踪的顶部:

System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) +505
   Mvc.Mailer.MailerBase.CreateControllerContext() +98
   Mvc.Mailer.MailerBase.ViewExists(String viewName, String masterName) +127

【问题讨论】:

    标签: asp.net-mvc mvcmailer


    【解决方案1】:

    MVCMailer 的PopulateBody 方法在MailerBase 类中有3 个参数和4 个参数重载(3 个参数版本实际上调用了4 个参数重载,masterName 设置为null):

    // 3 arguments overload
    public virtual void PopulateBody(MailMessage mailMessage, string viewName, Dictionary<string, string> linkedResources) 
    {
        PopulateBody(mailMessage, viewName, null, linkedResources);
    }
    
    // 4 arguments overload
    public virtual void PopulateBody(MailMessage mailMessage, string viewName, string masterName = null, Dictionary<string, string> linkedResources = null) 
    {
        ...
    }
    

    根据该发现,使用额外的 null 来填充不必要的方法参数,使用 3 或 4 参数版本:

    // 3 arguments
    mailer.PopulateBody(mailMessage, "RequestApproved", null); 
    
    // 4 arguments
    mailer.PopulateBody(mailMessage, "RequestApproved", null, null);
    

    由于可能的原因源自MailerBase 类(在var routeData = RouteTable.Routes.GetRouteData(CurrentHttpContext);CurrentHttpContext 传递了空值),您可以在HttpContextBase 中看到对HttpContextBase 虚拟属性的空值检查的使用情况@。

    类似问题:

    MvcMailer unit tests: System.ArgumentNullException httpContext cannot be null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多