Частый доступ к временным файлам ASP.NET
Буквально каждый второй раз, когда я запускаю большой уродливый проект веб-сайта, я получаю UnauthorizedAccessException, с сообщением, указывающим на DLL, например. Temporary ASP.NET Files\ctheweb\0d76d363\4695c81f\App_Web_vi6bbbpy.dll' is denied.
Затем я останавливаю и перезапускаю проект, и он работает нормально. Я тестирую, отлаживаю, исправляю, запускаю его снова и снова получаю ошибку.
Я склонен добавить команду pre-build, чтобы просто очистить этот каталог, но я всегда предпочитаю решить проблему с чем-то другим, кроме молотка, по крайней мере изначально.
Ответы
Ответ 1
Это происходит во время разработки, когда вы постоянно изменяете страницы aspx, ASP.NET пытается скомпилировать и VS пытается скомпилировать, а ASP.NET пытается выполнить файлы. Кроме того, когда-то блокировка исчезает, когда вы reset 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 \, чем по умолчанию.
И, наконец, используйте проект развертывания, чтобы попытаться предварительно скомпилировать все заранее. Никакая компиляция не означает попытку заменить вещи во временной папке
Или вы можете попробовать диагностику ОС и попытаться выяснить, какой процесс заблокирован в этом файле и убить этот процесс. Не стоит прилагать усилий, когда существуют более простые решения.
Ответ 2
В моем случае ответ был тривиальным - с самого начала никогда не было ошибки. Для меня ASP.NET на самом деле бросает это внутренне каждый раз, когда он запускает мое веб-приложение, и я просто забыл об ошибке "break on all exception" случайно (из другого сеанса отладки). Я проверил его, и все сработало нормально.
Для справки, здесь 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
Ответ 3
ЕСЛИ это блокировка, вызванная каким-то внешним процессом, например, антивирусным сканером или поисковым индексом, тогда вы можете попробовать использовать разрешения Windows для блокировки прав других пользователей и процессов для чтения файлов. По умолчанию каталог Temporary ASP.NET Files
доступен для пользователей, администраторов, служб IIS_USR, SYSTEM и TrustedInstaller - иными словами, почти всех.
Попробуйте руководство MatthewMartin для разных файлов компиляции;
<compilation tempDirectory = "C:\LimitedPermissionCompilationDir\" />
И затем ограничьте папку LimitedPermissionCompilationDir
только теми пользователями и группами, которым требуется разрешение - скажем, IIS_USR, если вы работаете в IIS или вашей собственной учетной записи, если вы компилируете файл на основе веб-сервера.
В любом случае, это относительно безопасный способ попробовать, так как вам не нужно беспокоиться о том, чтобы влиять на что-либо другое, кроме сайта, на котором вы работаете.
Ответ 4
У меня были подобные проблемы в прошлом из-за того, что антивирусная программа рабочей станции обращалась к файлу с "неправильным" временем. Еще один инструмент, который вы можете использовать для определения открываемого файла: Process Explorer (рекомендуется для вашего личного арсенала, даже если он не окажется полезным здесь, честно говоря).
Ответ 5
Я нашел это, когда я использовал ipersonation для другого пользователя в моем web.config, и у пользователя не было прав. DOH!
Ответ 6
Убедитесь, что у вас нет такого процесса, как "Рабочий стол Windows", индексирующий эту папку.
Ответ 7
Похоже, что у вас есть что-то, что содержит открытый дескриптор этого файла; вы можете отслеживать его с помощью Filemon или какого-то подобного инструмента, чтобы увидеть, какой процесс он держит открытым дескриптором.