ASP.NET代码隐藏中的当前工作目录 - 我们可以依赖它吗?

Jef*_*ege 7 asp.net iis

我们可以依赖ASP.NET代码隐藏中的当前工作目录吗?或者,换句话说,我们可以使用相对路径,并确保它们可以工作吗?

如果在网站的一个页面中,我将当前工作目录设置为特定的,那么下次加载网站上的另一个页面时它是否仍然相同?加载网站上的同一页面时?

如果我将当前工作目录设置为特定的,在Page_Load()中,我可以确定在调用Page_PreRender()时它仍然是相同的吗?或者同一网站上的另一个页面可以在我之间进行更改吗?同一个应用程序池中不同网站上的页面是否会改变它?在不同的应用程序池中的不同网站中的页面?

换句话说,IIS中当前工作目录的范围是什么?它是否特定于页面?它是否特定于网站?或者它是在应用程序池中的所有页面之间共享的?

在页面,网站,应用程序池和服务器之间的哪些边界隔离了当前工作目录的不同值?

小智 9

AppDomain.CurrentDomain.RelativeSearchPath 将为您提供bin文件夹的物理路径


Mic*_*pat 5

Environment.CurrentDirectoryGetCurrentDirectorySetCurrentDirectory winapi函数的简单包装器.实际上,尝试设置目录需要UnmanagedCode权限.每当某个功能阻止您的网站以部分信任方式运行时,您都应该谨慎依赖它.:)

SetCurrentDirectory文档:

更改当前进程的当前目录.

我能找到的最好的解释包括w3wp.exe进程和ASP.NET站点之间的关系就是这个答案.您网站中的任何其他网页都可能会更改您网页的当前工作目录.同一应用程序池下任何其他站点上的任何页面都可能会更改页面的当前工作目录.当前工作目录的这些外部更改可能在页面执行期间的任何时间发生.另一方面,不同应用程序池下的站点上的页面不会更改页面的当前工作目录.我之所以说"可能潜在"的原因是,如果考虑网络园林场景,它会变得更加复杂,因为单个ASP可能有多个进程.

现在考虑这SetCurrentDirectory不是线程安全的:

多线程应用程序和共享库代码不应使用SetCurrentDirectory函数,应避免使用相对路径名.由SetCurrentDirectory函数写入的当前目录状态在每个进程中存储为全局变量,因此多线程应用程序无法可靠地使用此值,而不会从可能正在读取或设置此值的其他线程中损坏数据.此限制也适用于GetCurrentDirectory和GetFullPathName函数.例外情况是保证应用程序在单个线程中运行,例如在创建任何其他线程之前从主线程中的命令行参数字符串解析文件名.

机会是,你不希望依赖于当前的工作目录.话虽如此,鉴于依赖当前工作目录是多么愚蠢,您可以合理地确定没有其他代码会触及它.:)快速查看Reflector表明没有.NET框架代码更改它.虽然有一些功能可以检查,但请注意这些功能.如果您控制部署环境,则可以确保您的站点在其自己的应用程序池中运行.使用适当的同步技术,您应该能够安全地更新当前工作目录.我不会考虑除了黑客之外的任何东西.