2012-04-24 8 views
10

Ich habe eine ASP.Net MVC 3 App, die RavenDB Embedded als integrierten Backing Store für Daten verwendet, habe ich verwendet this Tutorial als Grundlage für den Beginn der Erstellung einer MVC-App mit RavenDB Embedded. Ich habe in der Lage gewesen, es auf meinem Entwicklungs-PC zu laufen, aber wenn es an der Zeit kam es auf unserem Windows Server 2003 Web-Server IIS6 bereitstellen warf es die folgenden Fehler:RavenDB Deployment-Problem

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

Die Quelle des Fehlers in Die referenzierte CompositionRoot.cs-Klasse wird bei der Initialisierung des einbettbaren Dokumentspeichers verwendet.

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

Warum geschieht dies nur auf dem Web-Server und nicht auf meiner Entwicklung PC? Ich bin mir nicht sicher, was die genaue Ursache sein könnte. Jede Hilfe wird geschätzt.

+0

klingt wie ein klassisches Berechtigungsproblem, das unter IIS ausgeführt wird. Nicht vertraut mit RavenDB eingebettet, aber ich würde es außerhalb von \ webroot bewegen und den IIS Benutzer priveleges diesem Pfad geben. – kenny

+0

ist RavenDB bereits entweder als Dienst oder von der Befehlszeile ausgeführt? – wal

Antwort

15

Es stellte sich heraus, dass es sich um ein Berechtigungsproblem handelte. Ich erteilte der IIS_IUSRS-Gruppe Änderungen und Schreibberechtigungen für das Stammverzeichnis des Anwendungsordners und verschaffte ihm die Berechtigungen für die ordnungsgemäße Initialisierung der Datenbank. Es gibt wahrscheinlich einen bestimmten Ordner innerhalb des Stammverzeichnisses, auf den er zugreifen muss (in meinem Fall wahrscheinlich der Ordner App_Data, da ich dort meine Instanz von RavenDB instanziiere). Ich muss testen, da ich nicht möchte, dass ein Benutzer die Rechte zum Ändern/Schreiben für den gesamten Anwendungsordner hat.

4

Sie müssen sicherstellen, dass Ihre CreateControllerFactory nur einmal ausgeführt wird, auch angesichts gleichzeitiger Anfragen beim Start der App.

+0

Dank Ayende stellte sich heraus, dass der Fehler ein Berechtigungsproblem war. Ich habe den Stammordner meiner Anwendung geändert und auf die Gruppe IIS_IUSRS geschrieben, wodurch die Datenbank ordnungsgemäß initialisiert werden konnte. Ich werde Ihre Antwort auch im Auge behalten, falls das Problem jemals wieder auftritt. Fantastische Arbeit an RavenDB, dies ist unser erstes Projekt in einer nicht-relationalen Datenbank, also sind wir gespannt, wie es funktioniert. – kingrichard2005