【问题标题】:Frequent Access Denied to Temporary ASP.NET Files拒绝频繁访问临时 ASP.NET 文件
【发布时间】:2014-12-08 03:48:57
【问题描述】:

实际上,每当我运行一个又大又丑的网站项目时,我都会收到 UnauthorizedAccessException,并带有一条指向 DLL 的消息,例如Temporary ASP.NET Files\ctheweb\0d76d363\4695c81f\App_Web_vi6bbbpy.dll' is denied. 然后我停止并重新启动项目,它运行良好。我做了一些测试,调试,修复,再次运行它,再次得到错误。

我倾向于添加一个预构建命令来清除该目录,但我总是更喜欢用锤子以外的东西解决问题,至少在最初是这样。

【问题讨论】:

  • 这周我也遇到了这个错误。但是,它只是在我在 64 位机器上将我的应用程序池切换到 32 位后才开始的。这也是你的情况吗?

标签: asp.net visual-studio-2008


【解决方案1】:

这种情况在开发过程中经常发生,当您不断修改 aspx 页面时,ASP.NET 正在尝试编译,而 VS 正在尝试编译,而 ASP.NET 正在尝试执行文件。此外,有时当您重置 IIS 时锁定会消失。

iisreset /stop
del "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\*.*"  /Q /F /S
del “C:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*.*” /Q /F /S
iisreset /start

如果在生产中发生这种情况,请将其添加到您的 web.config。

<compilation tempDirectory = “C:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\Other\” />

(滚动到一边,关键是选择一些\Other\文件夹而不是默认文件夹。

最后,使用部署项目尝试提前预编译所有内容。不编译意味着不尝试替换临时文件夹中的内容

或者您可以尝试操作系统诊断并尝试找出哪个进程锁定了该文件并终止该进程。当存在更简单的解决方案时,不值得付出努力。

【讨论】:

  • 请有人解释一下为什么这篇文章被否决了?简单地拒绝投票而不做出贡献是没有建设性的,而且很粗鲁。
  • 我不打算为随机投票进行辩护,但你的问题是你不想使用锤子,这是我给你的大锤。因为这是一个开发盒,脚本运行速度很快(不像最糟糕的锤子,重新启动),这对我来说似乎很合适。
  • 这是一个很好的解决方案。但是,将 iisreset 放在两个 del 命令之前,因为 w3p.exe 保留了这些文件,因此您希望能够进行删除。
  • 如果使用 VS 内置服务器 (Cassini),这是在 PowerShell 中替换“issreset”调用的一种大锤方法:get-process webdev.webserver*|kill 我使用通配符是因为在我的工作中,有时是 webdev.webserver20,有时是 webdev.webserver40。
  • 当这在我们的情况下不起作用时,我们发现(使用 filemon 和 processmon)C# 编译器在放置ASP.NET 临时文件中的结果(pdb 和 dll)。应用程序池用户没有对该目录的写入权限。
【解决方案2】:

在我的情况下,答案是微不足道的——从一开始就不是错误。对我来说,ASP.NET 实际上每次启动我的 Web 应用程序时都会在内部抛出这个,我只是偶然忘记了“所有异常中断”设置(来自另一个调试会话)。我检查了它,一切正常。

作为参考,这里是堆栈跟踪:

>   mscorlib.dll!System.IO.__Error.WinIOError(int errorCode, string maybeFullPath)  Unknown
    mscorlib.dll!System.IO.FileStream.Init(string path, System.IO.FileMode mode, System.IO.FileAccess access, int rights, bool useRights, System.IO.FileShare share, int bufferSize, System.IO.FileOptions options, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES secAttrs, string msgPath, bool bFromProxy, bool useLongPath, bool checkHost)    Unknown
    mscorlib.dll!System.IO.FileStream.FileStream(string path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, int bufferSize, System.IO.FileOptions options, string msgPath, bool bFromProxy)  Unknown
    mscorlib.dll!System.IO.FileStream.FileStream(string path, System.IO.FileMode mode)  Unknown
    System.Web.dll!System.Web.UI.Util.HasWriteAccessToDirectory(string dir) Unknown
    System.Web.dll!System.Web.HttpRuntime.SetUpCodegenDirectory(System.Web.Configuration.CompilationSection compilationSection) Unknown
    System.Web.dll!System.Web.HttpRuntime.HostingInit(System.Web.Hosting.HostingEnvironmentFlags hostingFlags, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException) Unknown
    System.Web.dll!System.Web.HttpRuntime.InitializeHostingFeatures(System.Web.Hosting.HostingEnvironmentFlags hostingFlags, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException)   Unknown
    System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters, System.Security.Policy.PolicyLevel policyLevel, System.Exception appDomainCreationException) Unknown
    System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters, System.Security.Policy.PolicyLevel policyLevel)  Unknown
    [AppDomain (DefaultDomain, #1) -> AppDomain (/LM/W3SVC/4/ROOT-1-130624548490751465, #2)]  
    System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters)    Unknown
    System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironmentAndReportErrors(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) Unknown
    System.Web.dll!System.Web.Hosting.ApplicationManager.GetAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters)   Unknown
    System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObjectInternal(string appId, System.Type type, System.Web.Hosting.IApplicationHost appHost, bool failIfExists, System.Web.Hosting.HostingEnvironmentParameters hostingParameters)    Unknown
    System.Web.dll!System.Web.Hosting.ProcessHost.StartApplication(string appId, string appPath, out object runtimeInterface)   Unknown

【讨论】:

    【解决方案3】:

    如果它由某些外部进程(如病毒扫描程序或搜索索引器)引起的锁定,那么您可以尝试使用 Windows 权限来锁定其他用户和进程读取文件的权限.默认情况下,Temporary ASP.NET Files 目录可供用户、管理员、IIS_USR、SYSTEM 和 TrustedInstaller 使用——也就是说,几乎所有人。

    试试 MatthewMartin 对不同编译文件夹的建议;

    <compilation tempDirectory = “C:\LimitedPermissionCompilationDir\” />
    

    然后将 LimitedPermissionCompilationDir 文件夹限制为仅需要权限的用户和组 - 例如,如果您在 IIS 上运行,则为 IIS_USR,如果您正在为基于文件的网络服务器进行编译,则为您自己的帐户。

    无论如何,这是一种相对安全的尝试方式,因为您无需担心会影响您正在运行的网站以外的任何内容。

    【讨论】:

    • 我遇到了一个问题,即 IIS 重置会导致对特定旧 Microsoft DLL 的访问被拒绝,并且任何后续为应用程序分拆的新 IIS 临时文件夹都会修复它。确信其他进程正在扫描并锁定此特定文件,我尝试了您的解决方案并为应用程序强制使用自定义临时目录,它似乎正在工作。不是问题的解决方案(文件的锁定),而是一个完全可以接受的解决方法,根本不会让人觉得草率或笨拙。谢谢!
    【解决方案4】:

    由于工作站的防病毒程序在“错误”时间访问文件,我过去也遇到过类似的问题。您可以使用另一个工具来确定打开了哪些文件:Process Explorer(坦率地说,即使它在这里没有用,也推荐用于您的个人武器库)。

    【讨论】:

      【解决方案5】:

      当我在 web.config 中为另一个用户使用模拟并且该用户没有权限时,我发现了这一点。呵呵!

      【讨论】:

        【解决方案6】:

        确保您没有像“Windows 桌面搜索”这样的进程为该文件夹编制索引。

        【讨论】:

          【解决方案7】:

          听起来您有一些东西正在持有该文件的打开句柄;您可以使用Filemon 或其他类似工具对其进行追踪,以查看持有打开句柄的进程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-07
            • 1970-01-01
            • 2010-12-01
            • 1970-01-01
            • 2011-06-04
            • 2016-03-09
            • 1970-01-01
            相关资源
            最近更新 更多