Ошибка FileAccessDenied (JET_errFileAccessDenied, Не удается получить доступ к файлу, файл заблокирован или используется)

Я пытаюсь развернуть Raven DB на своем сайте с .Net 4 в интегрированном режиме (ранее сайт использовался для размещения сайта ASP.Net MVC 3.

Мой файл конфигурации таков:

<appSettings>
    <add key="Raven/DataDir" value="~\App_Data"/>
    <add key="Raven/AnonymousAccess" value="All"/>
  <add key="Raven/Port" value="80"/>
</appSettings>
<system.webServer>
    <handlers>
        <add name="All" path="*" verb="*"
                type="Raven.Web.ForwardToRavenRespondersFactory, Raven.Web"/>
    </handlers>
</system.webServer>

Однако исключение, которое я получаю, заключается в следующем:

**Error FileAccessDenied (JET_errFileAccessDenied, Cannot access file, the file is locked or in use)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Microsoft.Isam.Esent.Interop.EsentErrorException: Error FileAccessDenied (JET_errFileAccessDenied, Cannot access file, the file is locked or in use)

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[EsentErrorException: Error FileAccessDenied (JET_errFileAccessDenied, Cannot access file, the file is locked or in use)]
   Microsoft.Isam.Esent.Interop.Api.Fail(Int32 err) in C:\Work\ravendb\SharedLibs\Sources\ManagedEsent-48322\EsentInterop\Api.cs:2279
   Microsoft.Isam.Esent.Interop.Api.JetInit(JET_INSTANCE& instance) in C:\Work\ravendb\SharedLibs\Sources\ManagedEsent-48322\EsentInterop\Api.cs:130
   Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\raven\Raven.Storage.Esent\TransactionalStorage.cs:169

[InvalidOperationException: Could not open transactional storage: d:\IIS\domainfolder\ravendb\App_Data\Data]
   Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\raven\Raven.Storage.Esent\TransactionalStorage.cs:182
   Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration configuration) in c:\Builds\raven\Raven.Database\DocumentDatabase.cs:127
   Raven.Web.ForwardToRavenRespondersFactory..cctor() in c:\Builds\raven\Raven.Web\ForwardToRavenRespondersFactory.cs:31

[TypeInitializationException: The type initializer for 'Raven.Web.ForwardToRavenRespondersFactory' threw an exception.]
   Raven.Web.ForwardToRavenRespondersFactory..ctor() +0

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +1136
   System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +111
   System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture) +23
   System.Web.HttpRuntime.CreateNonPublicInstance(Type type, Object[] args) +60
   System.Web.Configuration.HandlerFactoryCache..ctor(String type) +46
   System.Web.HttpApplication.GetFactory(String type) +81
   System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +223
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184**

Я связался со своим хостом и получил подтверждение, что у меня есть доступ для чтения/записи к App_Data, и я также подтвердил это сам, написав код для создания там файла.

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

Может ли кто-нибудь из вас указать мне на решение здесь?

ОБНОВЛЕНИЕ 18 мая 2011 г. Я использую RavenDB-Build-360, который в настоящее время доступен по адресу http://builds.hibernatingrhinos.com/download/2004. Я использую инструкции по установке на http://ravendb.net/documentation/docs-deployment-iis для запуска на IIS 7.5. Но вместо того, чтобы использовать собственный локальный IIS, я просто копирую содержимое папки /Web на свой хост. Это означает папку /bin, файл web.config и XAP-файл SilverLight. Поэтому я не могу отлаживать свой путь через что-либо.

Я не заметил первую строку (о модуле WebDAV), но я уточню у своего хоста как можно скорее.
Как Raven DB полагается на это?


person Jesper Lund Stocholm    schedule 17.05.2011    source источник
comment
Есть ли у сайта полный уровень доверия ASP.NET? Я думаю, что Raven нуждается в полном доверии, потому что Esent является неуправляемым кодом.   -  person nickvane    schedule 17.05.2011
comment
И убедитесь, что вы создаете только 1 экземпляр DocumentStore и инициализируете его только один раз (в global.asax Application_Start) (отсюда двойная инициализация моего хранилища данных)   -  person nickvane    schedule 17.05.2011
comment
Привет, nickvane, я не просил эту информацию, но я предполагаю, что она имеет средний уровень доверия. Задокументировано ли где-нибудь требование для работы Raven DB с полным доверием? Кроме того, я использую сборку (текущая: 360) с предварительно скомпилированной веб-папкой, поэтому у меня нет прямого доступа к global.asax.   -  person Jesper Lund Stocholm    schedule 17.05.2011
comment
Привет, nickvane, я только что получил подтверждение того, что сайт работает в полном доверии, так что это не должно быть причиной проблемы.   -  person Jesper Lund Stocholm    schedule 17.05.2011
comment
Если веб-сервер может записывать в папку, вероятно, это проблема двойной инициализации. Можете ли вы отладить свой проект и посмотреть, вызывается ли дважды код инициализации RavenDB?   -  person Matt Warren    schedule 17.05.2011
comment
@jesper-lund-stoholm Можете ли вы показать нам код, в котором инициализируется хранилище документов? Полное доверие для Esent не задокументировано, но вы можете найти дополнительную информацию в этой теме groups.google.com/group/ravendb/browse_thread/thread/.   -  person nickvane    schedule 17.05.2011
comment
Как вы инициализируете RavenDB? Это как отдельное веб-приложение? Это как встроенное хранилище документов?   -  person Ayende Rahien    schedule 17.05.2011
comment
Привет всем, спасибо за ваш вклад. Я обновил сообщение с некоторыми более подробной информацией о том, что я пытаюсь сделать.   -  person Jesper Lund Stocholm    schedule 18.05.2011
comment
Привет Айенде, это простое веб-приложение. Я просто использую предварительно скомпилированные сборки og build 360, и вместо того, чтобы создавать сайт локально в IIS и указывать его в папку /Web, я копирую содержимое папки /Web на свой (общий) хост.   -  person Jesper Lund Stocholm    schedule 20.05.2011
comment
Я столкнулся с этой ошибкой при развертывании моего приложения MVC с использованием последней версии RavenDB. Сообщение об ошибке было правильным, у меня не было разрешения на запись в моем App_Data. Я изменил свои разрешения на своем хостинге, чтобы включить сетевую службу и веб-пользователя для чтения/записи, и это решило проблему.   -  person Steven Hook    schedule 24.06.2011
comment
Пожалуйста, ответьте ниже и примите свой ответ, чтобы другие могли найти решение.   -  person Jerry Bullard    schedule 10.11.2011


Ответы (2)


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

person nologo    schedule 15.11.2011
comment
Это решение сработало и для меня, хотя использование учетной записи администратора кажется плохой идеей ... Интересно, какие конкретные разрешения я могу применить к учетной записи, которую я использовал, а не просто сделать ее администратором. - person t3rse; 06.01.2012

Я также столкнулся с этой проблемой и не смог решить ее ни одним из решений, найденных в Интернете.

В итоге я зашел в IIS, щелкнул правой кнопкой мыши свое веб-приложение, которое использует Raven, редактировать разрешения.

Выберите вкладку «Безопасность», нажмите «Сетевая служба», затем установите флажок «Полный доступ». Нажмите «Применить», все снова заработало.

Итог: оказалась проблема с разрешениями. Я не уверен, почему мои разрешения были изменены, так как все это работало несколько дней назад. Возможно, патч IIS? Я не знаю. В любом случае убедитесь, что у сетевой службы есть разрешение для вашего веб-приложения, использующего raven. Я дал полный контроль над сетевой службой, но вам может сойти с рук управление чтением/записью.

person Judah Gabriel Himango    schedule 15.12.2011