HttpContext.Current.Server.MapPath对象引用未设置为对象的实例

43

我正在一个类中使用以下代码:

string filePath = HttpContext.Current.Server.MapPath("~/email/teste.html");

文件teste.html在文件夹中。

但是当打开该文件时,会生成以下错误:

对象引用未设置为对象的实例。


MapPath 的调用是发生异常的地方吗?听起来可能有另一行代码抛出了异常,如果是这样的话,你能否发布实际抛出异常的那一行代码。 - CodingGorilla
几乎所有的“NullReferenceException”异常情况都是相同的。请参考“.NET中的NullReferenceException是什么?”获取一些提示。 - John Saunders
5个回答

85

不要使用Server.MapPath。它很慢。请改用HttpRuntime.AppDomainAppPath。只要您的网站在运行,这个属性就一直可用。

然后像这样使用:

string filePath = Path.Combine(HttpRuntime.AppDomainAppPath, "email/teste.html");

在类库中使用时,出现错误:“非可调用成员'System.Web.HttpRuntime.AppDomainAppPath'不能像方法一样使用。” - Jitendra Pancholi
Jitendra,HttpRuntime.AppDomainAppPath 是属性而非方法。敬礼,Nick - nickytonline
哦!太棒了,终于在很长时间后成功了。 - Cherry
@user12345,很高兴能帮到你。 - nickytonline
@thiru,是的,它会。 - nickytonline
显示剩余3条评论

8

7

如果没有 HttpContext (例如在通过 BeginInvoke 调用方法时,正如 Yahia 指出的那样),那么调用 HttpContext.Current.Server.MapPath() 就会失败。对于这些情况,在 System.Web.Hosting 命名空间中有 HostingEnvironment.MapPath()

string filePath = HostingEnvironment.MapPath("~/email/teste.html");

这不处理相对路径,例如 ../images/ - AaA

1
你可以使用以下类似的代码片段。需要注意的一点是,我曾经遇到过一个问题,在TestMethod中尝试访问.txt文件时,除了这个之外所有都失败了...是的,它也适用于非单元测试场景。 string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..") + "\\email\\teste.html";

0
问题:我在一个类库项目中有一个“Images”文件夹。但是使用上述答案后,我无法获取该文件夹的物理路径以读/写该文件夹中的文件。
解决方案:以下代码对我有用,可以在类库项目中获取物理路径。
string physicalPath = System.IO.Path.GetFullPath("..\\..\\Images");

我希望这能帮助到和我面临同样问题的人。


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