显然
HttpContext.Current,
null不仅是在处理传入请求的线程中访问它。这就是为什么“当我在页面的另一个类中使用此代码时”起作用的原因。
它不会在与调度相关的类中起作用,因为相关代码不是在有效线程上执行,而是在没有HTTP上下文关联的后台线程上执行。
总的来说,不要
Application["Setting"]用来存储全局的东西,因为它们并不像您发现的那样是全局的。
如果需要将某些信息向下传递到业务逻辑层,请作为参数传递给相关方法。不要让您的业务逻辑层访问诸如
HttpContext或之类的东西
Application["Settings"],因为这违反了隔离和解耦的原则。
更新:由于引入了
async/await此类问题的机率更高,因此您可以考虑以下提示,
通常,仅应
HttpContext.Current在少数情况下(例如,在HTTP模块中)调用。在所有其他情况下,您应使用
Page.Context
https://docs.microsoft.com/zh-cn/dotnet/api/system.web.ui.page.context?view=netframework-4.7.2Controller.HttpContext
https://docs.microsoft.com/zh-cn/dotnet/api/system.web.mvc.controller.httpcontext?view=aspnet-mvc-5.2
代替
HttpContext.Current。



