Проблема с развертыванием RavenDB

У меня есть приложение ASP.Net MVC 3, которое я разработал, который использует RavenDB Embedded в качестве интегрированного хранилища резервных копий для данных, я использовал этот учебник в качестве основы для начала создания приложения MVC с RavenDB Embedded. Мне удалось запустить его на моем компьютере разработки, но когда пришло время его развертывания на нашем веб-сервере под управлением Windows Server 2003 с IIS6, он сделал следующую ошибку:

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

Сведения об исключении: Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException: не удается файл доступа, файл заблокирован или используется

Ошибка источника:

Необработанное исключение было создано во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение может быть идентифицировано с использованием трассы стека исключений ниже.

Трассировка стека:

[EsentFileAccessDeniedException: невозможно получить доступ к файлу, файл заблокирован или используется] Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) в C:\Work\ravendb\SharedLibs\Sources\managedesent-61618\EsentInterop\Api.cs: 2736 Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) в C:\Строит\RavenDB-Стабильный\Raven.Storage.Esent\TransactionalStorage.cs: 207

[InvalidOperationException: не удалось открыть транзакционное хранилище: C:\Inetpub\Wwwroot\MyApp\App_Data\Database\RavenDB\Data]
Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) в C:\Строит\RavenDB-Стабильный\Raven.Storage.Esent\TransactionalStorage.cs: 222 Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration конфигурации) в C:\Строит\RavenDB-Stable\Raven.Database\DocumentDatabase.cs: 185
Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() в C:\Строит\RavenDB-Stable\Raven.Client.Embedded\EmbeddableDocumentStore.cs: 143 Raven.Client.Document.DocumentStore.Initialize() в C:\Строит\RavenDB-Стабильное\Raven.Client.Lightweight\Документ\DocumentStore.cs: 496 MyApp.CompositionRoot.CreateControllerFactory() в... \MyApp\CompositionRoot.cs: 36 MyApp.CompositionRoot..ctor() в.. \MyApp\CompositionRoot.cs: 17
MyApp.MvcApplication.Application_Start() в... MyApp\Global.asax.cs: 38

[HttpException (0x80004005): Не удалось открыть транзакционное хранилище: C:\Inetpub\Wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext контекст, приложение HttpApplication) +3985477
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, контекст HttpContext, обработчики MethodInfo []) +191
System.Web.HttpApplication.InitSpecial(состояние HttpApplicationState, Обработчики MethodInfo [], IntPtr appContext, контекст HttpContext) +325
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr контекст приложения, контекст HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): Не удалось открыть транзакционное хранилище: C:\Inetpub\Wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpRuntime.FirstRequestInit(контекст HttpContext) +11524352 System.Web.HttpRuntime.EnsureFirstRequestInit(контекст HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, контекст HttpContext) +4782309

Источником ошибки в ссылочном классе CompositionRoot.cs является инициализация хранилища встраиваемых документов.

private static IControllerFactory CreateControllerFactory()
{
    var cacheRepository = new EmbeddableDocumentStore();
    cacheRepository.ConnectionStringName = "RavenDB";

    #if DEBUG
        cacheRepository.UseEmbeddedHttpServer = true;
    #endif

    Raven.Database.Server.NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(8080);
    cacheRepository.Initialize(); //Source of Error
    var controllerFactory = new TDRControllerFactory(cacheRepository);
    return controllerFactory;
}

Почему это происходит только на веб-сервере, а не на моем компьютере разработки? Я не знаю, какая именно причина. Любая помощь приветствуется.

Ответ 1

Это оказалось проблемой с разрешениями, я предоставил группе IIS_IUSRS возможность изменять и записывать разрешения в корневую папку моего приложения и предоставлял ей разрешения, необходимые для правильной инициализации базы данных. Вероятно, в корневой папке есть определенная папка, для которой ему нужен доступ для изменения/записи (в моем случае, вероятно, в папку App_Data, так как я создаю экземпляр RavenDB экземпляра). Я должен будет протестировать, так как я бы не хотел, чтобы любой пользователь имел права на изменение/запись во всю папку приложения.

Ответ 2

Вам нужно убедиться, что ваш CreateControllerFactory будет запускаться только один раз, даже перед лицом одновременных запросов при запуске приложения.