Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用hang fire和ASP.NET Core发送每日摘要电子邮件_C#_Asp.net Core_Hangfire - Fatal编程技术网

C# 使用hang fire和ASP.NET Core发送每日摘要电子邮件

C# 使用hang fire和ASP.NET Core发送每日摘要电子邮件,c#,asp.net-core,hangfire,C#,Asp.net Core,Hangfire,我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它 我已经为发送电子邮件上了一堂课: public class SummaryEmailBusiness { private MyDbContext _db; private IEmailSender _emailSender; public SummaryEmailBusiness(MyDbContext db, IEmailSender emailSender) { _db = d

我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它

我已经为发送电子邮件上了一堂课:

public class SummaryEmailBusiness
{
    private MyDbContext _db;
    private IEmailSender _emailSender;

    public SummaryEmailBusiness(MyDbContext db, IEmailSender emailSender)
    {
        _db = db;
        _emailSender = emailSender;
    }

    public void SendAllSummaries()
    {
        foreach(var user in _db.AspNetUsers)
        {
            //send user a summary
        }
    }
}
然后在
ConfigureServices()
中,我注册了服务和hangfire:

services.AddHangfire(config =>
    config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));

services.AddTransient<SummaryEmailBusiness>();
现在我被卡住了。Hang fire医生说我需要做以下事情:

RecurringJob.AddOrUpdate(() =>  SendAllSummaries() , Cron.Daily);
我不知道如何做到这一点,以使类在注入依赖服务的情况下启动。如何引用实例化服务的
SendAllSummaries()
方法


最好的方法是什么?

您只需注册作业(在调用
UseHangfireServer
后的某个地方),如下所示:

RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), Cron.Daily);
RecurringJob.AddOrUpdate(x=>x.SendAllSummaries(),Cron.Daily);

正在执行
services.AddHangfire
已注册特殊的
JobActivator
,它不仅从asp.net core DI容器解析作业实例,而且还为每个作业创建新的作用域,这在您的情况下很重要,因为您的
MyDbContext
很可能已注册为作用域。

Hangfire正在使用CRON表达式。Cron.Daily是Cron表达式“0***”的简写,它在每天午夜运行。如果您想在一天中的其他时间运行它,例如上午6点,您可以

RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), "0 6 * * *");
RecurringJob.AddOrUpdate(x=>x.SendAllSummaries(),“0.6***”);

阅读更多关于

我是否在ConfigureServices()中调用它的信息?我尝试并获得了
JobStorage.Current属性值尚未初始化。您必须在使用Hangfire客户端或服务器API之前进行设置
。我尝试设置
JobStorage.Current=newsqlserverstorage(“DefaultConnection”)
但它给出了连接字符串的错误(我用来注册我的db上下文的同一个连接字符串,可以正常工作)@Guerrilla您需要在
app.UseHangfireServer()之后的某个时间调用它。所以,至少在
Configure
中,而不是在
ConfigureServices
中。啊,非常酷。我现在可以在仪表板中看到任务。非常感谢你的帮助!啊,那好多了。谢谢你花时间指出这一点。
RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), "0 6 * * *");