我System.Timers.Timer
在我的Asp.Net应用程序中使用a ,我需要使用HttpServerUtility.MapPath
似乎只能通过的方法HttpContext.Current.Server.MapPath
.问题是,HttpContext.Current
是null
的,当Timer.Elapsed
事件触发.
是否有另一种方法来获取对HttpServerUtility对象的引用?我可以在我的类'构造函数中注入它.安全吗?如何确保在当前请求结束时不会收集垃圾?
谢谢!
可以使用HostingEnvironment.MapPath()
而不是HttpContext.Current.Server.MapPath()
我还没有在线程或计时器事件中尝试过它.
我考虑过的一些(不可行的)解决方案;
我唯一关心的方法HttpServerUtility
是MapPath
.因此,作为替代方案,我可以使用AppDomain.CurrentDomain.BaseDirectory
并构建我的路径.但如果您的应用程序使用虚拟目录(我的确),这将失败.
另一种方法:将所需的所有路径添加到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('/', '\\'); }
HostingEnvironment不是一个完美的解决方案,因为它是一个非常难以模拟的类(请参阅如何使用HostingEnvironment.MapPath对单元测试代码进行单元测试).
对于那些需要可测试性的人来说,更好的方法可能是按照/sf/ask/17360801/的建议创建自己的路径映射器接口,除非将其实现为
public class ServerPathMapper : IPathMapper { public string MapPath(string relativePath) { return HostingEnvironment.MapPath(relativePath); } }
结果很容易模拟,在内部使用HostingEnvironment,甚至可能同时解决ase69s的问题.