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

Cos*_*sto 88 .net asp.net timer httpcontext

System.Timers.Timer在我的Asp.Net应用程序中使用a ,我需要使用HttpServerUtility.MapPath似乎只能通过的方法HttpContext.Current.Server.MapPath.问题是,HttpContext.Currentnull的,当Timer.Elapsed事件触发.

是否有另一种方法来获取对HttpServerUtility对象的引用?我可以在我的类'构造函数中注入它.安全吗?如何确保在当前请求结束时不会收集垃圾?

谢谢!

Cos*_*sto 142

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

我还没有在线程或计时器事件中尝试过它.


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

  • 我唯一关心的方法HttpServerUtilityMapPath.因此,作为替代方案,我可以使用AppDomain.CurrentDomain.BaseDirectory并构建我的路径.但如果您的应用程序使用虚拟目录(我的确),这将失败.

  • 另一种方法:将所需的所有路径添加到Global类中.解决这些路径Application_Start.


小智 14

我不知道这是否会解决您的虚拟目录问题,但我将其用于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('/', '\\');
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 13

HostingEnvironment不是一个完美的解决方案,因为它是一个非常难以模拟的类(请参阅如何使用HostingEnvironment.MapPath对单元测试代码进行单元测试).

对于那些需要可测试性的人来说,更好的方法可能是按照/sf/answers/86237371/的建议创建自己的路径映射器接口,除非将其实现为

public class ServerPathMapper : IPathMapper { 
 public string MapPath(string relativePath) { 
      return HostingEnvironment.MapPath(relativePath); 
 } 
} 
Run Code Online (Sandbox Code Playgroud)

结果很容易模拟,在内部使用HostingEnvironment,甚至可能同时解决ase69s的问题.