代码之家  ›  专栏  ›  技术社区  ›  Costo

如何在线程或计时器中访问httpServerUtility.mapPath方法?

  •  87
  • Costo  · 技术社区  · 16 年前

    我用 System.Timers.Timer 在我的ASP.NET应用程序中,我需要使用 HttpServerUtility.MapPath 方法似乎只能通过 HttpContext.Current.Server.MapPath . 问题是 HttpContext.Current null Timer.Elapsed 事件火灾。

    有没有其他方法来获取对httpServerUtility对象的引用? 我可以将它注入到类的构造函数中。安全吗?我如何确保它不会在当前请求结束时被垃圾收集?

    谢谢!

    6 回复  |  直到 9 年前
        1
  •  140
  •   Matt user129975    9 年前

    可以使用 HostingEnvironment.MapPath() 而不是 HttpContext.Current.Server.MapPath()

    不过,我还没有在线程或计时器事件中尝试过。


    我考虑的一些(不可行的)解决方案;

    • 我唯一关心的方法 HttpServerUtility MapPath . 作为一种选择,我可以使用 AppDomain.CurrentDomain.BaseDirectory 并以此为基础建立我的道路。 但如果你的应用程序使用虚拟目录,这将失败 (我的)。

    • 另一种方法: 将我需要的所有路径添加到 Global 班级。在中解析这些路径 Application_Start .

        2
  •  14
  •       16 年前

    我不知道这是否可以解决您的虚拟目录问题,但我将其用于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('/', '\\');
    }
    
        3
  •  13
  •   Community CDub    8 年前

    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 同时。

        4
  •  2
  •   Mark S. Rasmussen    16 年前

    在启动计时器之前,您不能调用mappath函数,并且只缓存结果吗?在Tick事件中是否绝对需要调用mapPath?

        5
  •  2
  •   zvikara    16 年前

    当计时器超时时,没有当前的HTTP上下文。这是因为计时器事件与特定的HTTP请求无关。

    您应该做的是在HTTP上下文可用的地方使用httpserverputility.mappath。您可以在一个请求管道事件(如page_load)或全局.asax事件(如application_start)中执行此操作。

    将mappath结果分配给可从timer.elapsed事件访问的变量,在该事件中可以使用path.combine来获取所需特定文件的位置。

        6
  •  0
  •   Vaibhav    16 年前

    我认为当时它为空的原因(如果您考虑它的话)是计时器经过的事件不会作为HTTP请求的一部分发生(因此没有上下文)。它是由服务器上的某个东西引起的。

    推荐文章