我有一个值,我用在所有的应用程序中;我在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为空?
- 编辑:**当我在页面的另一个类中使用此代码时,它可以工作,但在这个类中,我得到了错误。
5条答案
按热度按时间62o28rlo1#
很明显,只有当你在一个处理传入请求的线程中访问
HttpContext.Current
时,它才不是null
。这就是为什么"当我在一个页面的另一个类中使用这段代码时"它能工作的原因。它不会在排程相关类别中运作,因为相关程式码不是在有效的执行绪上执行,而是在背景执行绪上执行,而背景执行绪没有与相关的HTTP内容。
总的来说,不要使用
Application["Setting"]
来存储全局的东西,因为它们并不像您发现的那样是全局的。如果需要将某些信息向下传递到业务逻辑层,请将其作为参数传递给相关的方法。不要让业务逻辑层访问
HttpContext
或Application["Settings"]
之类的内容,因为这违反了隔离和解耦的原则。更新:由于
async/await
的引入,此类问题的发生频率更高,因此您可以考虑以下提示,一般来说,您应该只在少数情况下(例如在HTTP模块中)调用
HttpContext.Current
。Page.Context
https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.page.context?view=netframework-4.7.2Controller.HttpContext
https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.controller.httpcontext?view=aspnet-mvc-5.2而不是
HttpContext.Current
。xqnpmsa82#
在集成模式的IIS7中,
Current
在Application_Start
中不可用。有一个类似的线程here。nzrxty8p3#
尝试实现
Application_AuthenticateRequest
而不是Application_Start
。这个方法有一个
HttpContext.Current
的示例,这与Application_Start
不同(Application_Start
在应用生命周期中触发得很快,快到还没有保存HttpContext.Current
对象)。希望能有所帮助。
nafvub8i4#
如果这是WCF服务,则可以在web.config中添加以下内容
一个布尔值,指示是否已为当前应用程序打开ASP.NET兼容模式。默认值为
false
。当此属性设置为
true
时,对Windows Communication Foundation(WCF)服务的请求将流经ASP.NET HTTP管道,并禁止通过非HTTP协议进行通信。snvhrwxg5#
如果您使用的是asp.net webforms应用程序,请尝试在web.config中添加以下行,它可能会对您有用: