为什么HttpContext.Current为null?

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

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

回答:

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

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

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

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

更新:由于引入了async/await此类问题的机率更高,因此您可以考虑以下提示,

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

  • Page.Context https://docs.microsoft.com/zh-cn/dotnet/api/system.web.ui.page.context?view=netframework-4.7.2
  • Controller.HttpContext https://docs.microsoft.com/zh-cn/dotnet/api/system.web.mvc.controller.httpcontext?view=aspnet-mvc-5.2

代替HttpContext.Current

以上是 为什么HttpContext.Current为null? 的全部内容, 来源链接: utcz.com/qa/418543.html

回到顶部