Por qué es HttpContext.Actual null?
Tengo un valor que uso en toda la aplicación; lo establezco en 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();
}
Y en 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();
}
}
Quiero obtener este valor en una clase.(smsjob)
public class SmsJob : IJob
{
public virtual void Execute(IJobExecutionContext context)
{
HttpContext.Current.Application["Setting"];
}
}
Pero mi problema es : HttpContext.Current es null, por qué es HttpContext.Actual null?
Editar: Cuando uso este código en otra clase de una página funciona, pero en esta clase obtengo el error.
3 answers
Claramente HttpContext.Current
no es null
solo si accedes a él en un subproceso que maneja las solicitudes entrantes. Es por eso que funciona "cuando uso este código en otra clase de una página".
No funcionará en la clase relacionada con la programación porque el código relevante no se ejecuta en un subproceso válido, sino en un subproceso en segundo plano, que no tiene ningún contexto HTTP asociado.
En general, no use Application["Setting"]
para almacenar productos globales, ya que no son globales como descubrió.
Si necesita pasar ciertos información hasta la capa lógica de negocio, pasar como argumentos a los métodos relacionados. No permita que su capa lógica de negocio acceda a cosas como HttpContext
o Application["Settings"]
, ya que eso viola los principios de aislamiento y desacoplamiento.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 14:42:11
Intenta implementar Application_AuthenticateRequest
en lugar de Application_Start
.
Este método tiene una instancia para HttpContext.Current
, a diferencia de Application_Start
(que se activa muy pronto en el ciclo de vida de la aplicación, lo suficientemente pronto como para no contener un objeto HttpContext.Current
todavía).
Espero que eso ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-22 05:39:58
En IIS7 con modo integrado, Current
no está disponible en Application_Start
. Hay un hilo similar aquí.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:54