在Azure上托管时,警报会延迟一小时

时间:2018-04-17 17:32:07

标签: azure asp.net-core .net-core asp.net-core-2.0 hangfire

我使用hangfire来安排在用户指定的时间发送电子邮件提醒。当我在localhost上测试应用程序时,警报被安排在正确的时间,当我向Azure上托管的实时应用程序发送请求时,请求的安排时间比它应该晚一个小时。

我认为问题是我对DateTimeOffset缺乏了解。我在JobScheduler课程中所做的是

    public class JobScheduler : IJobScheduler
    {
        private EmailManager _emailManager;

        public JobScheduler(IAlertManager alertManager)
        {
            _alertManager = alertManager;
        }
        public string ScheduleRaiseDateAlert( DateDetail date)
        {
            DateTimeOffset jobRunTime = ConvertToDateTimeOffSet(date.CheckInTime);
            return BackgroundJob.Schedule(()=> _alertManager.RaiseAlertAsync(date.Id, true), jobRunTime.DateTime);
        }
        private DateTimeOffset ConvertToDateTimeOffSet(DateTime futureDateTime)
        {
            futureDateTime = DateTime.SpecifyKind(futureDateTime, DateTimeKind.Utc);
            DateTimeOffset ScheduleTime = futureDateTime;
            return ScheduleTime;
        }
    }

date.CheckInTime 是应向用户发送电子邮件的日期时间

例如:如果 date.CheckInTime = 17/04/2018 19:02:00 当我在本地主机上发送请求时,将安排该作业日期和时间,当我将相同的请求发送到azure上托管的应用程序时,作业计划的时间是 17/04/2018 20:02:00

1 个答案:

答案 0 :(得分:1)

AFAIK,DateTimeOffset.DateTime将被视为本地日期时间,您可以查看发送至Kind的{​​{1}}实例的jobRunTime.DateTime属性。

对于支持BackgroundJob.Schedule参数的BackgroundJob.Schedule重叠方法,存储的 EnqueueAt 将是DateTimeOffset参数的DateTimeOffset.UtcDateTime。< / p>

对于DateTimeOffset参数,存储的 EnqueueAt 将是添加指定TimeSpan的当前UTC日期时间。

此外,如果您将本地时间TimeSpan实例传递给DateTime,则存储的 EnqueueAt 将转换为相关的UTC日期时间。

由于您没有提供如何构建BackgroundJob.Schedule,我建议您检查存储的任务以缩小此问题的范围。我使用了UseSqlServerStorage,对于这种方法,您可以检查DateDetail表下的计划任务的状态。

HangFire.State

{"EnqueueAt":"2018-04-20T06:39:28.0305044Z","ScheduledAt":"2018-04-18T06:39:29.5398973Z"} 代表您创建此任务的UTC日期时间,ScheduledAt代表触发任务的UTC日期时间。