来自Hang Fire的难度调用方法

时间:2017-12-04 21:57:35

标签: c# twilio hangfire

我有一个控制器方法,负责安排约会。我打算安排一项任务,在他们预约登记服务前5分钟通过短信(twilio)提醒用户。

这是我的方法调用:

private SMSNotifier sms = new SMSNotifier();
 BackgroundJob.Schedule( () => sms.SendPatientUpcomingApptNotificationTest(appointment), appointment.Start.AddMinutes(-5));

这是我的班级:

public SMSNotifier()
    {
        var accountSid = ConfigurationManager.AppSettings["TwilioSid"];
        // Your Auth Token from twilio.com/console
        var authToken = ConfigurationManager.AppSettings["TwilioToken"]; ;

        TwilioClient.Init(accountSid, authToken);
    }


    public void SendPatientUpcomingApptNotificationTest(Appointment appt)
    {

            var message = MessageResource.Create(
        to: new PhoneNumber("+xxxxxxxxxx"),
        from: new PhoneNumber("+xxxxxxxxxx"),
        body: string.Format("Hello {0} {1}! You have an upcoming web based video appointment with xxxxxxxxxx. Please login to the website to be seen. Your appointment time is: {2} Thank you - xxxxxxxx", "xxxxxxx", "xxxxxxxx", appt.Start));

    }
}

我一直收到这个错误:

Server Error in '/' Application.

Self referencing loop detected for property 'User' with type 'System.Data.Entity.DynamicProxies.AspNetUser_80E6332CC002F8FCF589159A68E74A0922BEE992586B9FE280D950E149CCC7EB'. Path 'Patient.ActiveSessions[0]'.

但我只是不明白为什么。我没有在任何地方引用User对象。

我应该提一下,我显然用Google搜索了这个错误:

  1. JSON.NET Error Self referencing loop detected for type

  2. Self referencing loop detected - Getting back data from WebApi to the browser

  3. 这些都没有提供任何进展。我仍然有同样的错误。

    你们有什么想法?

    我绝对认为这与我尝试安排'SendPatientUpcomingApptNotificationTest'方法的方式有关。我可以做一个Console.WriteLine,它可以很好地排队。

    IE:

      BackgroundJob.Schedule( () => Console.WriteLine("TestSchedule"), appointment.Start.AddMinutes(-5));
    

    完美运作

1 个答案:

答案 0 :(得分:1)

尝试序列化appointment对象时,听起来好像遇到了这个错误。

当您安排后台作业时,Hangfire会保存有关您正在调用的方法及其对其作业存储的参数的信息。如果您将复杂对象作为参数传递给方法,它会尝试将整个对象图序列化为json。

recommended approach is to keep your job arguments small and simple。例如,将约会ID传递给作业而不是整个约会:

BackgroundJob.Schedule( () => sms.SendPatientUpcomingApptNotificationTest(appointmentId), ...);

然后你将检索作业中的实际appointment