【发布时间】:2015-05-20 18:07:59
【问题描述】:
我在 Web API 应用中有一段代码:
private Stream ConvertWorkBookToStream(WorkBook workBook)
{
var tempFileName = Path.GetTempFileName();
// The following line throws a NullReferenceException
workBook.write(tempFileName);
// Remainder elided for brevity
}
workBook 和 tempFileName 都不是 null。
一时兴起,我将应用程序池更改为在域管理员帐户下运行,以消除任何权限问题(因为我最近观察到我的机器上出现了一些普遍的问题)并重新运行它。抛出了同样的异常。
然后我创建了一个控制台应用程序并将方法逐字复制到应用程序中并运行它。 没有抛出异常。
现在,值得注意的是,就在昨天,我遇到了关于 File.Exists 的类似令人费解的行为。
考虑以下调用:
var exists = File.Exists(@"\\myshare\\myexistingfile.ext");
假设路径指向一个实际存在的文件:
- 在网络应用下,
exists返回false在我的机器上。 - 在控制台应用程序中,同样的操作返回
true。
我的同事正在经历相反的行为。
谁能解释一下?我有点束手无策。
【问题讨论】:
-
乍一看肯定会怀疑一些奇怪的权限问题。假设 Web 应用程序在 IIS 下运行,关联的应用程序池的身份有什么特殊或不寻常的地方吗? (例如,考虑可能阻止遍历它所认为的基于网络的资源的身份)
-
堆栈跟踪是什么?调试的时候,能看出哪一个是空的吗?
-
检查从 Path.GetTempFileName 返回的结果是否与控制台应用程序和 Web 应用程序不同。 Windows 可能在跟你开玩笑。
-
ARRRRRRRRRGHHHHHH 当然。不同用户上下文的不同临时文件夹。 &)(&(*%&*%) :) 很高兴你解决了。
-
@DavidW:Awww。如果我是一个更好的人,我会送你一个慰问纸杯蛋糕。但这是残酷的编码。 >=)