代码之家  ›  专栏  ›  技术社区  ›  Jeff Dege

ASP.NET中当前的工作目录代码落后-我们能依赖它吗?

  •  6
  • Jeff Dege  · 技术社区  · 16 年前

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

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

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

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

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    Environment.CurrentDirectory 是一个简单的包装 GetCurrentDirectory SetCurrentDirectory winapi函数。实际上,尝试设置目录需要非托管代码权限。每当一个函数阻止您的站点以部分信任的方式运行时,您就应该谨慎地依赖它。:)

    SetCurrentDirectory 文档:

    更改当前目录 对于当前流程 .

    我能找到的最好的解释包括 w3wp.exe 进程和ASP.NET站点是 this answer . 网站中的任何其他页面 可能 更改页面的当前工作目录。同一应用程序池下任何其他站点上的任何页面 可能 更改页面的当前工作目录。在页面执行期间,对当前工作目录的这些外部更改可能随时发生。另一方面,站点上不同应用程序池下的页面不会更改页面的当前工作目录。我之所以说“可能”,是因为如果考虑到Web花园场景,它会变得更加复杂,其中一个ASP.NET站点可以有多个进程。

    现在考虑一下 设置当前目录 不是线程安全的:

    多线程应用程序和共享 库代码不应使用 setcurrentdirectory函数和 应避免使用相对路径 名字。当前目录状态 由setcurrentdirectory写入 函数存储为全局 因此,每个过程中的变量 多线程应用程序不能 在没有 其他数据可能损坏 也可能正在读取或 设置此值。这种局限性 也适用于 getcurrentdirectory和 GetFullPathName函数。这个 当应用程序 保证在 单线程,例如解析 命令行中的文件名 主线程中的参数字符串 在创建任何其他 线程。在中使用相对路径名 多线程应用程序或共享 库代码可能产生不可预测的 结果和不受支持。

    很有可能 您不想依赖当前工作目录 . 尽管如此,考虑到依赖当前工作目录是多么愚蠢,您可以合理地确定没有其他代码会接触到它。:)快速浏览一下Reflector显示没有.NET框架代码更改它。不过,有几个函数确实会检查它,所以要当心那些函数。如果控制部署环境,则可以确保站点在其自己的应用程序池中运行。通过适当的同步技术,您应该能够 安全地 更新当前工作目录。不过,除了黑客,我什么都不会考虑。

        2
  •  8
  •   Marek Grzenkowicz    14 年前

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

        3
  •  0
  •   IrishChieftain    16 年前

    应使用tilde(~)运算符相对于站点根目录创建链接:

    <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/

    推荐文章