我们可以依赖ASP.NET代码隐藏中的当前工作目录吗?或者,换句话说,我们可以使用相对路径,并确保它们可以工作吗?
如果在网站的一个页面中,我将当前的工作目录设置为特定的,那么下次加载网站上的另一个页面时它是否仍然相同?当加载网站上的同一页面时?
如果我将当前工作目录设置为特定的,在Page_Load()中,我可以确定在调用Page_PreRender()时它仍然是相同的吗?或者同一网站上的另一个页面可以在我之间进行更改吗?同一个应用程序池中不同网站上的页面是否会改变它?不同应用程序池中不同网站的页面?
换句话说,IIS中当前工作目录的范围是什么?它是否特定于页面?它是否特定于网站?或者它是否在应用程序池中的所有页面之间共享?
在页面,网站,应用程序池和服务器之间的哪些边界隔离了当前工作目录的不同值?
答案 0 :(得分:8)
AppDomain.CurrentDomain.RelativeSearchPath
将为您提供bin文件夹的物理路径
答案 1 :(得分:5)
Environment.CurrentDirectory是围绕GetCurrentDirectory和SetCurrentDirectory winapi函数的简单包装器。实际上,尝试设置目录需要UnmanagedCode权限。每当某个函数阻止您的网站以部分信任方式运行时,您都应该谨慎依赖它。 :)
来自SetCurrentDirectory
文档:
更改当前进程的当前目录 。
我能找到的涵盖w3wp.exe
进程与ASP.NET站点之间关系的最佳解释是this answer。您网站中的任何其他网页都可能更改您网页的当前工作目录。同一应用程序池下任何其他站点上的任何页面都可能更改页面的当前工作目录。当前工作目录的这些外部更改可能在页面执行期间的任何时间发生。另一方面,不同应用程序池下的站点上的页面不会更改页面的当前工作目录。我之所以说“可能潜在”的原因是,如果你考虑使用web园景,那么单个ASP.NET站点可能有多个进程就会变得更加复杂。
现在考虑SetCurrentDirectory
不是线程安全的:
多线程应用程序和共享 库代码不应该使用 SetCurrentDirectory函数和 应避免使用相对路径 名。当前目录状态 由SetCurrentDirectory编写 函数存储为全局 因此,每个过程都有变量 多线程应用程序不能 无需可靠地使用此值 其他可能的数据损坏 线程也可能正在阅读或 设置此值。这个限制 也适用于 GetCurrentDirectory和 GetFullPathName函数。该 异常是申请时 保证在一个 单线程,例如解析 命令行中的文件名 主线程中的参数字符串 在创建任何其他之前 线程。使用相对路径名称 多线程应用程序或共享 库代码可以产生不可预测的 结果并且不受支持。
有可能您不想依赖当前的工作目录。话虽如此,鉴于依赖当前工作目录是多么愚蠢,您可以合理地确定没有其他代码会触及它。 :)快速查看Reflector表明没有.NET框架代码更改它。虽然有一些功能可以检查,但请注意这些功能。如果您控制部署环境,则可以确保您的站点在其自己的应用程序池中运行。通过适当的同步技术,您应该能够安全地更新当前工作目录。除了黑客之外,我不会考虑其他任何事情。
答案 2 :(得分:0)
应使用波浪号(〜)运算符相对于站点根创建链接:
<a href="~/mysite/somepage.aspx" id="someLink" runat="server">Some Page</a>
在服务器中,应用程序池完全隔离了您的站点,这样如果某个其他站点在同一台服务器上崩溃,它就不会使您的站点崩溃。 IIS几乎是针对特定于站点的,具有应用程序池的额外隔离优势。我认为尝试将一个页面上的链接从另一个页面中的代码隐藏更改(或者我可能不太明白这个问题)时没有实际用途。
以下是IIS架构的摘要:
http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis-7/