Directory.Exists 用于 ASP.NET 中的网络路径
Posted
技术标签:
【中文标题】Directory.Exists 用于 ASP.NET 中的网络路径【英文标题】:Directory.Exists for network paths in ASP.NET 【发布时间】:2016-03-02 20:57:23 【问题描述】:我想得到:
Directory.Exists(@"E:\subdirectory")
当 E: 是持久映射网络驱动器时,从 ASP.NET 运行时返回“true”。我使用以下命令从在我的用户上下文下运行的命令行映射它,它成功返回并且不提示输入凭据:
net use E: \\servername\sharename /persistent:yes
此时我完全在本地运行。
当我从控制台应用程序或 linqpad 运行 Directory.Exists 行时,它返回 true。当我从在 IIS(not IIS express)下运行的 ASP.NET 应用程序运行它时,它返回 false。
我已更改我的应用程序池以使用我在本地运行的相同用户帐户。我已通过以下方式验证这已生效:
检查我的 Windows 进程列表并确保 w3wp.exe 在我的用户帐户下运行。 将我的 ASP.NET 应用程序附加到 w3wp.exe 并设置断点,然后检查 Environment.UserName 和 Environment.UserDomainName 以验证我是否在我的用户帐户的上下文中运行。但是,我的 ASP.NET 应用程序在检查网络共享时仍然返回 false。
这是为什么?
【问题讨论】:
您是否尝试过使用 Server.MapPath? Directory.Exists(Server.MapPath(@"E:\subdirectory"));I think I have a unique problem.
非常幼稚.. :)
@Kramb,谢谢,但这会引发异常:'E:/subdirectory' 是物理路径,但应该是虚拟路径。
@Eser 澄清一下,我发现的所有线程都围绕共享不起作用,因为人们没有在正确的用户上下文中运行 IIS。据我所知,我是在正确的用户环境下运行的。
@tarun713 查看(并使用)msdn.microsoft.com/en-us/library/windows/desktop/…
【参考方案1】:
映射的网络驱动器与用户会话相关联。 IIS 在会话 0 中运行,您的映射驱动器很可能在会话 1 中运行。
当您为会话创建网络驱动器时,我不知道有任何方法可以让其他会话显示网络驱动器,我认为您不需要使用 E:\
而是使用 \\servername\sharename
作为路径。
【讨论】:
这确实有效,但映射的驱动器不应该在任何会话中持续存在吗?因为我将其标记为持续存在? 不,如果您结束会话,persist 只会重新映射,然后使用同一用户开始新的会话。 如果你真的想要,here is a hack 可以让你在会话 0 中执行net use E: \\servername\sharename /persistent:yes
,这样它将在该会话中持续存在。风险自负,我真的建议您不要使用它,而只需使用网络路径。以上是关于Directory.Exists 用于 ASP.NET 中的网络路径的主要内容,如果未能解决你的问题,请参考以下文章
在Directory.Delete Directory.Exists有时返回true?
Directory.Exists - 访问被拒绝 C# 的 UNC 路径