2012-04-24 4 views
10

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

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.EsentFileAccessDeniedException: 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:

[EsentFileAccessDeniedException: Cannot access file, the file is locked or in use] Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) in C:\Work\ravendb\SharedLibs\Sources\managedesent-61618\EsentInterop\Api.cs:2736 Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:207

[InvalidOperationException: Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) in c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:222 Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration configuration) in c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:185
Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() in c:\Builds\RavenDB-Stable\Raven.Client.Embedded\EmbeddableDocumentStore.cs:143 Raven.Client.Document.DocumentStore.Initialize() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\DocumentStore.cs:496 MyApp.CompositionRoot.CreateControllerFactory() in ...\MyApp\CompositionRoot.cs:36 MyApp.CompositionRoot..ctor() in ..\MyApp\CompositionRoot.cs:17
MyApp.MvcApplication.Application_Start() in ...MyApp\Global.asax.cs:38

[HttpException (0x80004005): Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +3985477
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +191
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +325
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +375

[HttpException (0x80004005): Could not open transactional storage: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11524352 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +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; 
} 

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

+0

звучит как классическая проблема с правами, работающая под IIS. Совсем не знакомы с встроенным RavenDB, но я бы переместил его за пределы \ webroot и предоставил пользователям привилегии IIS этому пути. – kenny

+0

- это RavenDB, уже запущенный либо как служба, либо из командной строки? – wal

ответ

15

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

4

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

+0

Спасибо Айенде, ошибка оказалась проблемой с разрешениями. Я дал возможность изменить и написать доступ к корневой папке моего приложения в группу IIS_IUSRS, и это позволило правильной инициализации базы данных. Я также буду учитывать ваш ответ, если проблема снова возникнет. Фантастическая работа над RavenDB, это наше первое предприятие в нереляционной базе данных, поэтому мы очень хотим увидеть, как это работает. – kingrichard2005

Смежные вопросы