File.Exists() 在 IIS 上总是返回 false

Posted

技术标签:

【中文标题】File.Exists() 在 IIS 上总是返回 false【英文标题】:File.Exists() always returns false on IIS 【发布时间】:2013-05-19 19:20:12 【问题描述】:

我使用 File.Exists() 检查的文件路径位于映射驱动器 (Z:\hello.txt) 上。代码在调试环境中运行良好,但是在 IIS 中,它总是返回 false

var fullFileName = string.Format("0\\1", ConfigurationManager.AppSettings["FileName"], fileName);

if (System.IO.File.Exists(fullFileName))

为什么会这样,我该如何解决这个问题?

我已授予每个人对该映射驱动器的完全读/写权限

编辑:

我尝试通过\\192.168.1.12\Examples\Files\2.xml 删除文件,得到相同的结果。它不会在 IIS 上检测到文件,但在调试时工作正常

【问题讨论】:

【参考方案1】:

您的 Web 应用程序在特定的安全上下文下运行,您需要找出这是什么上下文。如果是普通用户,以用户身份打开命令提示符(使用runas工具),使用命令提示符映射所需的驱动器(一定要使用/persistent:yes标志)

或者,您为什么不能只使用 UNC 路径 (\\serverName\shareName) 并避免所有这些废话?

编辑:2013-05-27 要解决此问题,请根据您想要的任何应用程序池创建一个新的应用程序池。然后设置运行该池的标识,如随附的屏幕截图所示。

确保此用户对文件共享具有正确的权限,然后重新测试

【讨论】:

我刚试过。我正在尝试使用此路径删除我的文件 \\192.168.1.12\Examples\Files\2.xml - 结果相同。它适用于 VS 的调试,但不适用于托管在 IIS 中。 您的网站运行的应用程序池的标识是什么?【参考方案2】:

我在使用网络映射驱动器时遇到过类似的问题,运行调试代码应用程序运行良好,运行发布版本应用程序时找不到文件。

如果文件存储在部署应用程序的同一台服务器上,我们通过存储映射驱动器的本地驱动器目录位置找到了解决方案,例如 Z:\files\ 可能是 E:\folder\folder1\

如果应用程序部署在我们发现使用完整网络名称的单独服务器上,例如\\server1\folder\

我希望这对你有所帮助。

【讨论】:

我刚试过。我正在尝试使用此路径 \\192.168.1.12\Examples\Files\2.xml 删除我的文件 - 结果相同。它适用于 VS 的调试,但不适用于托管在 IIS 中。【参考方案3】:

我认为您的应用程序没有“Z:”权限 是“Z:”网盘吗?

【讨论】:

用户 LocalSystem (NT AUTHORITY\SYSTEM) 没有网络访问权限 AFAIK。如果是这样,那么“您”(您的应用程序)必须冒充另一个用户。 因为ISS运行在你电脑上的user:SYSTEM上,所以无法访问Z:drive【参考方案4】:

也许你应该使用Path.DirectorySeparatorChar

【讨论】:

以上是关于File.Exists() 在 IIS 上总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

如果我不首先抛出 FileNotFoundExcetion,为啥 file.exists() 总是返回 true

File.Exists判断文件是不是存在总是返回False?

File.Exists仅在文件名上返回true

C# File.Exists 返回 false,文件确实存在

为什么File.exists()不起作用

为啥'File.exists'返回true,即使NIO'Files'类中的'Files.exists'返回false