如何在线程或者计时器中访问HttpServerUtility.MapPath方法?
我在Asp.Net应用程序中使用了" System.Timers.Timer",并且我需要使用" HttpServerUtility.MapPath"方法,该方法似乎只能通过" HttpContext.Current.Server.MapPath"使用。
问题是,在触发" Timer.Elapsed"事件时," HttpContext.Current"为" null"。
还有另一种方法来获取对HttpServerUtility对象的引用吗?
我可以将其注入类的构造函数中。安全吗?我如何确定在当前请求结束时不会收集垃圾?
谢谢!
解决方案
我认为当时它为null(如果我们考虑)的原因是,计时器经过的事件不会作为HTTP请求的一部分发生(因此没有上下文)。这是由服务器上的某些东西引起的。
我们不能在启动计时器之前调用MapPath函数,而只是缓存结果吗?在tick事件中是否绝对需要MapPath调用?
当计时器过去时,没有当前的HTTP上下文。这是因为计时器事件与特定的HTTP请求无关。
我们应该做的是使用HttpServerUtility.MapPath,其中HTTP上下文可用。我们可以在请求管道事件之一(例如Page_Load)或者Global.asax事件(例如Application_Start)中执行此操作。
将MapPath结果分配给可从Timer.Elapsed事件访问的变量,我们可以在其中使用Path.Combine获取所需的特定文件的位置。
可以使用HostingEnvironment.MapPath()而不是HttpContext.Current.Server.MapPath()
我还没有在线程或者计时器事件中尝试过它。
我考虑过一些(不可行的)解决方案;
- 我在
HttpServerUtility
上关心的唯一方法是MapPath
。因此,我可以使用AppDomain.CurrentDomain.BaseDirectory
并从中构建路径。但是,如果应用程序使用虚拟目录,这将失败(Mine会这样做)。 - 另一种方法:将我需要的所有路径添加到
Global
类中。在" Application_Start"中解析这些路径。
我不知道这是否可以解决虚拟目录问题,但是我将其用于MapPath:
public static string MapPath(string path) { if (HttpContext.Current != null) return HttpContext.Current.Server.MapPath(path); return HttpRuntime.AppDomainAppPath + path.Replace("~", string.Empty).Replace('/', '\'); }