2012-04-24 15 views
10

Mam aplikację ASP.Net MVC 3, którą opracowałem, która wykorzystuje RavenDB Embedded jako zintegrowany magazyn danych, użyłem samouczka this jako podstawy do rozpoczęcia tworzenia aplikacji MVC z RavenDB Embedded. Udało mi się go uruchomić dobrze na moim rozwoju PC, ale kiedy przyszedł czas, aby wdrożyć go na naszym Windows Server 2003 serwera WWW z systemem IIS6 ona rzuciła się następujący błąd:Wydanie wdrożenia 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

źródła błędu w przywoływana klasa CompositionRoot.cs ma miejsce podczas inicjowania magazynu dokumentów do wstawiania.

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; 
} 

Dlaczego dzieje się to tylko na serwerze internetowym, a nie na moim komputerze programistycznym? Nie jestem pewien, jaka może być dokładna przyczyna. Każda pomoc jest doceniana.

+0

brzmi jak klasyczny uprawnień emisji działającym pod kontrolą IIS. Nie zna RavenDB osadzony, ale chciałbym go przenieść poza \ Webroot i dać specjalnie uprawnionych użytkowników IIS do tej ścieżki. – kenny

+0

czy RavenDB działa już jako usługa lub z wiersza poleceń? – wal

Odpowiedz

15

To okazało się problemem uprawnień, nadałem grupie IIS_IUSRS uprawnienia do modyfikacji i zapisu w katalogu głównym folderu mojej aplikacji, co dało mu uprawnienia niezbędne do prawidłowej inicjalizacji bazy danych. Jest to prawdopodobnie dany folder w katalogu głównym, który potrzebuje zmodyfikować/zapisu do (w moim przypadku, prawdopodobnie w folderze App_Data, ponieważ to gdzie mam instancji moje wystąpienie RavenDB). Będę musiał przetestować, ponieważ nie chcę, aby jakikolwiek użytkownik miał prawa do modyfikacji/zapisu do całego folderu aplikacji.

4

Musisz upewnić się, że CreateControllerFactory będzie działać tylko raz, nawet w obliczu jednoczesnych żądań na ok starcie.

+0

Dzięki Ayende, błąd okazał się problemem uprawnień. Dałem modyfikacji i zapisu w katalogu głównym mojej aplikacji do grupy IIS_IUSRS i że pozwolił baza danych została właściwie zainicjowana. Będę również pamiętać o twojej odpowiedzi na wypadek, gdyby problem pojawił się ponownie. Fantastyczna praca na RavenDB, to jest nasze pierwsze przedsięwzięcie w non-relacyjnej bazy danych, więc jesteśmy niespokojny, aby zobaczyć jak to działa. – kingrichard2005