iis 为什么HttpContext.Current为空?

yk9xbfzb  于 2022-11-24  发布在  其他
关注(0)|答案(5)|浏览(295)

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

    • 编辑:**当我在页面的另一个类中使用此代码时,它可以工作,但在这个类中,我得到了错误。
62o28rlo

62o28rlo1#

很明显,只有当你在一个处理传入请求的线程中访问HttpContext.Current时,它才不是null。这就是为什么"当我在一个页面的另一个类中使用这段代码时"它能工作的原因。
它不会在排程相关类别中运作,因为相关程式码不是在有效的执行绪上执行,而是在背景执行绪上执行,而背景执行绪没有与相关的HTTP内容。
总的来说,不要使用Application["Setting"]来存储全局的东西,因为它们并不像您发现的那样是全局的。
如果需要将某些信息向下传递到业务逻辑层,请将其作为参数传递给相关的方法。不要让业务逻辑层访问HttpContextApplication["Settings"]之类的内容,因为这违反了隔离和解耦的原则。
更新:由于async/await的引入,此类问题的发生频率更高,因此您可以考虑以下提示,
一般来说,您应该只在少数情况下(例如在HTTP模块中)调用HttpContext.Current

而不是HttpContext.Current

xqnpmsa8

xqnpmsa82#

在集成模式的IIS7中,CurrentApplication_Start中不可用。有一个类似的线程here

nzrxty8p

nzrxty8p3#

尝试实现Application_AuthenticateRequest而不是Application_Start
这个方法有一个HttpContext.Current的示例,这与Application_Start不同(Application_Start在应用生命周期中触发得很快,快到还没有保存HttpContext.Current对象)。
希望能有所帮助。

nafvub8i

nafvub8i4#

如果这是WCF服务,则可以在web.config中添加以下内容

<configuration>
    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    </system.serviceModel>
</configuration>

一个布尔值,指示是否已为当前应用程序打开ASP.NET兼容模式。默认值为false
当此属性设置为true时,对Windows Communication Foundation(WCF)服务的请求将流经ASP.NET HTTP管道,并禁止通过非HTTP协议进行通信。

snvhrwxg

snvhrwxg5#

如果您使用的是asp.net webforms应用程序,请尝试在web.config中添加以下行,它可能会对您有用:

<appSettings>
   <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
</appSettings>

相关问题