我在Asp.Net应用程序中使用了System.Timers.Timer,并且我需要使用HttpServerUtility.MapPath方法,该方法似乎只能通过HttpContext.Current.Server.MapPath使用。问题是,当触发Timer.Elapsed事件时,HttpContext.Current为null。
有没有其他方法可以获得对HttpServerUtility对象的引用?我可以把它注入到我的类的构造函数中。安全吗?我如何确保它不会在当前请求的末尾被垃圾回收?
谢谢!
发布于 2008-09-21 21:19:40
可以不使用HttpContext.Current.Server.MapPath()而使用HostingEnvironment.MapPath()
不过,我还没有在线程或计时器事件中尝试过。
我考虑过的一些(不可行的)解决方案;
HttpServerUtility上,我唯一关心的方法就是MapPath。因此,作为替代,我可以使用AppDomain.CurrentDomain.BaseDirectory并由此构建我的路径。,但是如果你的应用程序使用虚拟目录(我的does).Global类中),这将失败。在Application_Start.中解析这些路径
发布于 2009-01-27 23:31:21
我不知道这是否能解决您的虚拟目录问题,但我在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('/', '\\');
}发布于 2012-07-10 05:52:06
HostingEnvironment不是完美的解决方案,因为它是一个很难模拟的类(请参阅How to unit test code that uses HostingEnvironment.MapPath)。
对于那些需要可测试性的人,更好的方法可能是按照https://stackoverflow.com/a/1231962/85196的建议创建您自己的路径映射器接口,除非将其实现为
public class ServerPathMapper : IPathMapper {
public string MapPath(string relativePath) {
return HostingEnvironment.MapPath(relativePath);
}
} 结果很容易被模仿,在内部使用HostingEnvironment,甚至可能同时处理ase69s's concern。
https://stackoverflow.com/questions/111927
复制相似问题