Частый доступ запрещен для временных файлов ASP.NET - PullRequest
14 голосов
/ 27 мая 2009

Буквально каждый второй раз, когда я запускаю большой уродливый проект веб-сайта, я получаю исключение UnauthorizedAccessException с сообщением, указывающим на DLL, например, Temporary ASP.NET Files\ctheweb\0d76d363\4695c81f\App_Web_vi6bbbpy.dll' is denied. Затем я останавливаю и перезапускаю проект, и он работает нормально. Я провожу некоторое тестирование, отладку, исправление, запускаю его снова и снова получаю сообщение об ошибке.

Я склонен добавить команду перед сборкой, чтобы просто очистить этот каталог, но я всегда предпочитаю решить проблему с чем-то другим, кроме молотка, по крайней мере, на начальном этапе.

Ответы [ 7 ]

10 голосов
/ 27 мая 2009

Это часто случается во время разработки, когда вы постоянно изменяете страницы 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 \, отличную от папки по умолчанию.

И, наконец, используйте проект развертывания, чтобы попытаться предварительно скомпилировать все. Отсутствие компиляции означает отсутствие попыток заменить вещи во временной папке

Или вы можете попробовать диагностику ОС и попытаться выяснить, какой процесс заблокировал этот файл, и уничтожить этот процесс. Не стоит усилий, когда существуют более простые решения.

10 голосов
/ 07 декабря 2014

В моем случае ответ был тривиальным - с самого начала это никогда не было ошибкой. Для меня ASP.NET фактически выдает это внутренне каждый раз, когда запускает мое веб-приложение, и я просто забыл, что параметр «разбить на все исключения» включен случайно (из другого сеанса отладки). Я проверил и все работало нормально.

Для справки вот трассировка стека:

>   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
4 голосов
/ 20 июня 2009

ЕСЛИ это - это блокировка, вызванная каким-либо внешним процессом, таким как антивирусный сканер или индексатор поиска, тогда вы можете попробовать использовать разрешения Windows для блокировки прав других пользователей и процессов на чтение файлов. По умолчанию каталог Temporary ASP.NET Files доступен для пользователей, администраторов, IIS_USR, SYSTEM и TrustedInstaller - то есть практически для всех.

Попробуйте совет МэттьюМартина о другой папке для компиляции;

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

А затем ограничьте папку LimitedPermissionCompilationDir только теми пользователями и группами, которым необходимо разрешение - скажем, IIS_USR, если вы работаете в IIS, или свою учетную запись, если вы компилируете для файлового веб-сервера. *

В любом случае, это относительно безопасный способ опробовать вещи, так как вам не нужно беспокоиться о влиянии чего-либо, кроме сайта, на котором вы работаете.

1 голос
/ 23 июля 2012

Я обнаружил это, когда использовал ipersonation для другого пользователя в моем web.config, и у него не было прав. DOH!

1 голос
/ 04 июня 2009

У меня были подобные проблемы в прошлом из-за того, что антивирусная программа рабочей станции обращалась к файлу в «неправильное» время. Еще один инструмент, который вы можете использовать для определения того, что файл открыт: Process Explorer (рекомендуется для вашего личного арсенала, даже если он откровенно не пригодится).

0 голосов
/ 27 мая 2009

Похоже, у вас есть что-то, что держит открытый дескриптор этого файла; Вы можете отследить его, используя Filemon или другой подобный инструмент, чтобы увидеть, что это за процесс, который удерживает открытую ручку.

0 голосов
/ 27 мая 2009

Убедитесь, что у вас нет такого процесса, как «Поиск на рабочем столе Windows», индексирующего эту папку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...