58

すべてのアプリケーションで使用する値があります。これをapplication_startに設定しました

  void Application_Start(object sender, EventArgs e)
  {
    Dictionary<int, IList<string>> Panels = new Dictionary<int, IList<string>>();
    List<clsPanelSetting> setting = clsPanelSettingFactory.GetAll();
    foreach (clsPanelSetting panel in setting)
    {
        Panels.Add(panel.AdminId, new List<string>() { panel.Phone,panel.UserName,panel.Password});
    }
    Application["Setting"] = Panels;

    SmsSchedule we = new SmsSchedule();
    we.Run();

  }

および SmsSchedule で

public class SmsSchedule : ISchedule
{
    public void Run()
    {           
        DateTimeOffset startTime = DateBuilder.FutureDate(2, IntervalUnit.Second);
        IJobDetail job = JobBuilder.Create<SmsJob>()
            .WithIdentity("job1")
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
             .WithIdentity("trigger1")
             .StartAt(startTime)
             .WithSimpleSchedule(x => x.WithIntervalInSeconds(60).RepeatForever())
             .Build();

        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sc = sf.GetScheduler();
        sc.ScheduleJob(job, trigger);

        sc.Start();
    }
}

この値をクラスで取得したい (smsjob)

   public class SmsJob : IJob 
   {  
      public virtual void Execute(IJobExecutionContext context)
      {
          HttpContext.Current.Application["Setting"]; 
      }
   }

しかし、私の問題は次のとおりです。HttpContext.Currentはnullです。なぜHttpContext.Currentはnullなのですか?

編集: ページの別のクラスでこのコードを使用すると機能しますが、このクラスではエラーが発生します。

4

3 に答える 3

111

明らかに、着信要求を処理するスレッドでアクセスする場合だけでHttpContext.Currentはありません。nullそのため、「このコードをページの別のクラスで使用すると」機能します。

関連するコードは有効なスレッドではなく、HTTP コンテキストが関連付けられていないバックグラウンド スレッドで実行されるため、スケジューリング関連のクラスでは機能しません。

Application["Setting"]あなたが発見したように、それらはグローバルではないため、全体として、グローバルなものを保存するために使用しないでください。

特定の情報をビジネス ロジック レイヤーに渡す必要がある場合は、関連するメソッドに引数として渡します。分離と分離の原則に違反するため、ビジネス ロジック層がHttpContextや などにアクセスできないようにします。Application["Settings"]

更新: の導入により、async/awaitこのような問題が発生する頻度が高くなったため、次のヒントを検討してください。

HttpContext.Current一般に、少数のシナリオ (たとえば、HTTP モジュール内) でのみ呼び出す必要があります。それ以外の場合はすべて、使用する必要があります

の代わりにHttpContext.Current

于 2013-10-22T07:29:52.550 に答える
7

Application_AuthenticateRequestの代わりに実装してみてくださいApplication_Start

このメソッドには のインスタンスがあります(アプリのライフサイクルですぐに起動し、オブジェクトをまだ保持していない)HttpContext.Currentとは異なります。Application_StartHttpContext.Current

それが役立つことを願っています。

于 2013-10-22T05:34:34.657 に答える