Hangfire后台工作仍然排队

时间:2016-09-16 12:04:11

标签: c# asp.net-mvc-5 hangfire postal

我有一个MVC应用程序,我正在尝试使用Hangfire和Postal发送电子邮件。电子邮件必须在注册后发送。 注册工作正常,但我运行的工作仍然排队,我没有收到任何电子邮件。 所以在我的MVC控制器中,我有以下代码:

Wreck.post(`https://company-dev.eu.auth0.com/oauth/token`, {
      payload: {
        client_id: client_id, // rknvAeGruVDG3To0Lc37hMuDKsUNBBBV (too short?)
        code: code, // Sl9fF6grhgDoecDt
        redirect_uri: redirect_uri, // http://localhost:3000/login
        grant_type: grant_type, // 'authorization_code'
        client_secret: client_secret, // Shh, secret
        state: state // 123ABC123
      }
    }, (err, res, payload) => {
      if (err) {
        console.log(err);
        reject();
      }

      console.log(payload.toString('utf8'));
      resolve();
    });

我无法调试NotifyRegistration方法。我不知道为什么。我使用的是Postal,所以EmailService不是我的实现。我在这里如何配置smtp服务:

Unauthorized

如果我运行hangfire仪表板,我会看到已启用的作业

enter image description here

但没有其他事情发生。 发送电子邮件我错过了什么?

谢谢

更新 在startup.cs中我写了这个:

public async Task<ActionResult> Register(RegisterViewModel model)
{
    //register correctly the user

    //I send the email
    BackgroundJob.Enqueue(() => 
        NotifyRegistration(user.Id, user.UserName, user.Email)   
    );

    ...
 }

[AutomaticRetry(Attempts = 5)]
public async Task NotifyRegistration(string userId, string username, string email)
{
    //I calculate callbackUrl

    var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
    var engines = new ViewEngineCollection();
    engines.Add(new FileSystemRazorViewEngine(viewsPath));

    var emailService = new EmailService(engines);

    var emailToSend = new NewRegisteredUserEmail
    {
        To = email, UserName = username, CallbackUrl = callbackUrl 
    };

    emailService.Send(emailToSend);
}

更新2 我用这种方式改变了我的NotifyRegistration:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network host="smtp.live.com" port="25" enableSsl="true" userName="***" password="***"></network>
    </smtp>
  </mailSettings>
</system.net>

3 个答案:

答案 0 :(得分:4)

我发现了问题:

  1. 不支持sql server的版本。我使用的是2005.支持的数据库是2008R2及更高版本:http://docs.hangfire.io/en/latest/configuration/using-sql-server.html

  2. NotifyRegistration方法必须是静态的: https://discuss.hangfire.io/t/jobs-in-enqueue-state-most-never-run/2367/4

  3. [AutomaticRetry(Attempts = 5)]
    public static void NotifyRegistration(string userId, string username, string email, EmailService emailService)
    {
        //I calculate callbackUrl
    
        var emailToSend = new NewRegisteredUserEmail
        {
            To = email, UserName = username, CallbackUrl = callbackUrl 
        };
    
        emailService.Send(emailToSend);
    }
    

答案 1 :(得分:0)

我的猜测是与

有关
  1. 对HostingEnvironment.MapPath()或
  2. 的调用
  3. EmailService类型的一些内部构造细节。
  4. 令我印象深刻的是,这种方法有很多,如果出现这种情况可能会更加简单:

    1. 而不是实例化新的EmailService,您将其作为已实例化的依赖项传递给包含的类,并且
    2. 而不是尝试将物理文件路径从您作为参数传递给方法的方法中划分到模板目录。
    3. 如果你要进行这种重构,我敢打赌,这个问题会消失,并不是无足轻重的小猫。

答案 2 :(得分:0)

没有看到您的Hangfire配置......

你有app.UseHangfireServer();吗?这就是告诉Hangfire它需要执行的原因 - 否则你只是排队,因为它期望别的东西可以执行。