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 为空,为什么 HttpContext.Current 为空?

编辑: 当我在另一个页面类中使用此代码时,它可以工作,但在这个类中我得到了错误。

4

3 回答 3

111

显然HttpContext.Current不仅null是您在处理传入请求的线程中访问它。这就是为什么它“当我在另一类页面中使用此代码时”起作用的原因。

它在调度相关类中不起作用,因为相关代码不是在有效线程上执行的,而是在没有关联 HTTP 上下文的后台线程上执行的。

总的来说,不要Application["Setting"]用来存储全局的东西,因为它们不是你发现的全局的。

如果您需要将某些信息向下传递到业务逻辑层,请将其作为参数传递给相关方法。不要让你的业务逻辑层访问类似HttpContextor的东西Application["Settings"],因为这违反了隔离和解耦的原则。

更新:由于引入async/await它更经常发生此类问题,因此您可以考虑以下提示,

通常,您应该只HttpContext.Current在少数情况下调用(例如在 HTTP 模块中)。在所有其他情况下,您应该使用

而不是HttpContext.Current.

于 2013-10-22T07:29:52.550 回答
7

尝试实施Application_AuthenticateRequest而不是Application_Start.

这个方法有一个实例HttpContext.Current,不像Application_Start(它在应用程序生命周期中很快触发,很快就不会持有HttpContext.Current对象)。

希望有帮助。

于 2013-10-22T05:34:34.657 回答
7

在具有集成模式的 IIS7 中,CurrentApplication_Start. 这里有一个类似的线程。

于 2013-10-22T05:40:47.947 回答