2017-12-04 11 views
0

私は、予定のスケジューリングを担当するコントローラーメソッドを持っています。私はサービスにログインする予定の5分前にSMS(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オブジェクトを参照しません。

私は、明らかにそのエラーをググ言及する必要があります

:この

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

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

なしはありませんy進歩。私はまだ同じエラーがあります。

あなたはどう思いますか?

「SendPatientUpcomingApptNotificationTest」メソッドをスケジュールしようとしている方法と関係があります。私はConsole.WriteLineを行うことができ、それはうまくジョブをキューに入れます。

IE:完全

答えて

1

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

ワークスあなたのappointmentオブジェクトをシリアル化しようとしたとき、それは、このエラーに実行しているように聞こえます。

バックグラウンドジョブをスケジュールすると、呼び出し元のメソッドとその引数に関する情報がジョブストアに保存されます。メソッドに引数として複雑なオブジェクトを渡している場合、オブジェクトグラフ全体をjsonにシリアル化しようとします。

recommended approach is to keep your job arguments small and simple。例えば、全体ではなく、予定のジョブにappointmentIdを渡す:

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

その後、ジョブ内の実際のappointmentを取得します。

+0

ありがとうございます。ピーターさん、とても助かりました。私は問題なく今すぐ仕事を待ち行列に入れることができるようです。私の他の質問は、SMSNotifierクラスのコンストラクタが正しく実行されるかどうかです。私はまだ、HangFireコンソールでnull参照エラーが発生しています。しかし、SendPatientUpcomingApptNotificationTestメソッドを手動で実行すると正常に動作します。奇妙な権利ですか? – Waragi

+0

心配しないで、私の側でエラー。ピーター、ありがとう! – Waragi