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


88

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

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

谢谢!

Answers:


142

可以使用HostingEnvironment.MapPath()代替HttpContext.Current.Server.MapPath()

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


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

  • 我关心的唯一方法HttpServerUtilityMapPath。因此,我可以选择使用AppDomain.CurrentDomain.BaseDirectory并以此构建我的路径。但是,如果您的应用程序使用虚拟目录,这将失败(Mine会这样做)。

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


1
但是请注意,以上内容在更高版本的IIS中不起作用。在IIS7中,可以在http请求之外调用应用程序启动。即,代码示例。我确定HostingEnvironment.MapPath()仍将像以前一样工作。
罗巴

但是如果您将HostingEnvironment.MapPath()传递给它并输入空字符串以直接获取文件夹路径,则会出错。HttpContext.Current.Server.MapPath(“”); ->工作HostingEnvironment.MapPath(“”); ->引发错误
VSP 2012年

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('/', '\\');
}

path.Replace(“〜”,string.Empty)应该是path.Replace('〜','。')
Slava

13

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

对于需要可测试性的用户,更好的方法可能是按照https://stackoverflow.com/a/1231962/85196的建议创建自己的path-mapper接口,除了将其实现为

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

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


这使我能够为Web API项目提供路径解析的实现,而无需依赖于所引用库中的System.Web或System.Net。+1
大卫·彼得森

对此方法的DI和可测试性表示赞许
Dilhan Jayathilake

2

您不能在启动计时器之前调用MapPath函数,而只是将结果缓存吗?在tick事件中是否绝对需要MapPath调用?


2

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

您应该做的是使用HttpServerUtility.MapPath,其中HTTP上下文可用。您可以在请求管道事件之一(例如Page_Load)或Global.asax事件(例如Application_Start)中执行此操作。

将MapPath结果分配给可从Timer.Elapsed事件访问的变量,您可以在其中使用Path.Combine获取所需的特定文件的位置。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.