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?