频繁访问被拒绝临时ASP.NET文件

时间:2009-05-27 19:01:10

标签: asp.net visual-studio-2008

我每次第二次运行一个丑陋的网站项目时,都会收到一条UnauthorizedAccessException,并显示一条指向DLL的消息,例如: Temporary ASP.NET Files\ctheweb\0d76d363\4695c81f\App_Web_vi6bbbpy.dll' is denied.然后我停止并重新启动项目,它运行正常。我做了一些测试,调试,修复,再次运行,然后再次出错。

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

7 个答案:

答案 0 :(得分:10)

在开发期间,当您不断修改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 \文件夹而不是默认值。

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

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

答案 1 :(得分:10)

在我的情况下,答案是微不足道的 - 从一开始就不是一个错误。对我来说,ASP.NET每次启动我的Web应用程序时都会在内部抛出此内容,而我只是忘记了&#34;打破所有异常&#34;意外启动(来自另一个调试会话)。我检查了一切,一切正常。

供参考,这里是stacktrace:

>   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

答案 2 :(得分:4)

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

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

当我在web.config中为另一个用户使用ipersonation并且用户没有权限时,我发现了这一点。卫生署!

答案 5 :(得分:0)

确保您没有索引该文件夹的“Windows桌面搜索”过程。

答案 6 :(得分:0)

听起来你有一些东西对那个文件保持开放的句柄;你可以使用Filemon或类似的工具来追踪它,看看它是拿着开放手柄的过程。