当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在线程或计时器中访问HttpServerUtility.MapPath方法?》经验,为你挑选了3个好方法。

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

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

谢谢!



1> Costo..:

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

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


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

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

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



2> 小智..:

我不知道这是否会解决您的虚拟目录问题,但我将其用于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> Mike..:

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

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

public class ServerPathMapper : IPathMapper { 
 public string MapPath(string relativePath) { 
      return HostingEnvironment.MapPath(relativePath); 
 } 
} 

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有