为什么HttpContext.Current为null?

时间:2013-10-22 05:31:09

标签: c# asp.net iis httpcontext

我有一个我在所有应用程序中使用的值;我在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?

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

3 个答案:

答案 0 :(得分:79)

显然HttpContext.Current只有在处理传入请求的线程中访问null时才会Application["Setting"]。这就是为什么它“在我在一个页面的另一个类中使用这个代码时”。

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

总的来说,不要使用HttpContext来存储全局内容,因为它们不是您发现的全局内容。

如果需要将某些信息传递给业务逻辑层,请将参数作为参数传递给相关方法。不要让您的业务逻辑层访问Application["Settings"]async/await之类的内容,因为这违反了隔离和解耦的原则。

更新: 由于HttpContext.Current的引入,更常见的是此类问题发生,因此您可能会考虑以下提示,

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

而不是{{1}}。

答案 1 :(得分:7)

尝试实施Application_AuthenticateRequest而不是Application_Start

此方法有HttpContext.Current的实例,与Application_Start不同(在应用生命周期很快就会触发,很快就不能保存HttpContext.Current个对象。)

希望有所帮助。

答案 2 :(得分:7)

在具有集成模式的IIS7中,Current中不提供Application_Start。有类似的帖子here