すべてのアプリケーションで使用する値があります。 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.Current
はnull
ではありません。着信要求を処理するスレッドでアクセスする場合のみです。それが「ページの別のクラスでこのコードを使用する場合」に機能する理由です。
関連するコードは有効なスレッドではなく、HTTPコンテキストが関連付けられていないバックグラウンドスレッドで実行されるため、スケジューリング関連のクラスでは機能しません。
全体的に、Application["Setting"]
を使用してグローバルなものを保管しないでください。これらは発見したとおりグローバルではありません。
特定の情報をビジネスロジックレイヤーに渡す必要がある場合は、関連するメソッドに引数として渡します。ビジネスロジックレイヤーがHttpContext
やApplication["Settings"]
などにアクセスしないようにしてください。これは、分離と分離の原則に違反するためです。
更新:async/await
の導入により、このような問題が発生する頻度が高くなるため、次のヒントを検討してください。
通常、HttpContext.Current
を呼び出すのは、いくつかのシナリオ(たとえばHTTPモジュール内)でのみにしてください。他のすべての場合では、使用する必要があります
Page.Context
https://docs.Microsoft.com/en-us/dotnet/api/system.web.ui.page.context?view=netframework-4.7.2Controller.HttpContext
https://docs.Microsoft.com/en-us/dotnet/api/system.web.mvc.controller.httpcontext?view=aspnet-mvc-5.2HttpContext.Current
の代わりに。
統合モードのIIS7では、Current
はApplication_Start
で使用できません。同様のスレッドがあります here 。
Application_AuthenticateRequest
の代わりにApplication_Start
を実装してください。
このメソッドには、HttpContext.Current
とは異なり、Application_Start
のインスタンスがあります(アプリのライフサイクルですぐに起動し、HttpContext.Current
オブジェクトをまだ保持できないほどすぐに起動します)。
それが役立つことを願っています。