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.

Author: Lex Li, 2013-10-22

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.

 73
Author: Lex Li,
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.

 6
Author: geevee,
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í.

 6
Author: Tasos K.,
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