【问题标题】:How can I use Server.MapPath() from global.asax?如何使用 global.asax 中的 Server.MapPath()?
【发布时间】:2009-06-01 17:57:25
【问题描述】:

我需要使用Server.MapPath() 来组合我存储在web.config 中的一些文件路径。

但是,由于Server.MapPath() 依赖于当前的 HttpContext(我认为),我无法做到这一点。尝试使用该方法时,即使它“可用”,我也会收到以下异常:

服务器操作在此上下文中不可用。

是否有另一种方法可以将 Web 根相对目录(例如 ~/App_Data/)映射到完整的物理路径(例如 C:\inetpub\wwwroot\project\App_data\)?

【问题讨论】:

    标签: c# asp.net global-asax server.mappath application-start


    【解决方案1】:

    你可以试试System.Web.Hosting.HostingEnvironment.MapPath()

    不需要 HttpContext。

    【讨论】:

    • 这种技术有什么注意事项吗?
    • 不。如果启动 Reflector,您会注意到 Server.MapPath 和 Request.MapPath 最终调用 VirtualPath.MapPath,而 VirtualPath.MapPath 最终调用 HostingEnvironment.MapPath。他们最终都在同一个地方。 HostingEnvironment.MapPath 省去了中间人。
    • +1 这修复了一个对我有用的开源项目,然后由于 HttpContext.Current.Server 因某种原因没有上下文而停止初始化。切换到这个让它恢复顺畅。
    【解决方案2】:

    使用AppDomain.CurrentDomain.BaseDirectory,因为Context 可能返回null!!

    【讨论】:

      【解决方案3】:

      在 Global.asax 中,使用 context 对象:

      context.Server.mappath()

      Context 还允许您访问会话集合、请求对象、响应对象。例如,当您要记录错误时非常有用

      【讨论】:

      • Global.asax 中没有保证Context
      【解决方案4】:

      您可以尝试 HttpContext.Current.Server.MapPath("/") - 这就是我之前在课程中引用它的方式。

      【讨论】:

      • 您可以在实际上具有 HttpContext 的类中引用它,但我认为 global.asax 没有,因此我收到了错误消息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多