如何在global.asax中使用Server.MapPath()函数?

130

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

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

Server operation is not available in this context.

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

4个回答

311

这种技术有什么注意事项吗? - John B
11
不是的。如果你启动 Reflector,你会发现 Server.MapPath 和 Request.MapPath 最终都会调用 VirtualPath.MapPath,而 VirtualPath.MapPath 最终会调用 HostingEnvironment.MapPath。它们最终都会到达同一个地方。HostingEnvironment.MapPath 直接跳过了中间环节。 - Corbin March
1
+1 这解决了一个开源项目的问题,该项目之前一直在工作,但由于HttpContext.Current.Server没有上下文而停止初始化。切换到这个后使其恢复正常。 - Chris Marisic

5

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


1

在 Global.asax 中使用 context 对象:

context.Server.mappath()

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


Global.asax 中没有保证的 Context - Anders Marzi Tornblad

-5
你可以尝试使用HttpContext.Current.Server.MapPath("/") - 这是我以前在类中引用它的方式。

2
在确实有HttpContext的类中,您可以像这样引用它,但是我认为global.asax没有一个,因此我收到了错误消息。 - John B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接