2012-04-24 17 views
10

Ho un'app ASP.Net MVC 3 che ho sviluppato che utilizza RavenDB Embedded come archivio di supporto integrato per i dati, ho utilizzato il tutorial this come base per iniziare a creare un'app MVC con RavenDB Embedded. Sono stato in grado di farlo funzionare benissimo sul mio PC di sviluppo, ma quando è arrivato il momento di distribuirlo sul nostro web server IIS6 che esegue Windows Server 2003 è buttato il seguente errore:Problema di distribuzione 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

L'origine dell'errore in la classe CompositionRoot.cs di riferimento è quando l'inizializzazione del Document Store incorporabile.

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

Perché ciò accade solo sul server Web e non sul PC di sviluppo? Non sono sicuro di quale potrebbe essere la causa esatta. Qualsiasi aiuto è apprezzato.

+0

sembra un classico problema di autorizzazione in esecuzione in IIS. Non ho familiarità con RavenDB incorporato, ma lo sposterei al di fuori di \ webroot e darei i privilegi dell'utente di IIS a quel percorso. – kenny

+0

RavenDB è già in esecuzione come servizio o dalla riga di comando? – wal

risposta

15

Si è trattato di un problema di autorizzazioni, ho assegnato al gruppo IIS_IUSRS le autorizzazioni di modifica e scrittura nella directory principale della cartella dell'applicazione e che le ha fornito le autorizzazioni necessarie per inizializzare correttamente il database. Probabilmente c'è una cartella specifica all'interno della radice alla quale è necessario modificare/scrivere l'accesso (nel mio caso, probabilmente la cartella App_Data, poiché è lì che sto istanziando la mia istanza di RavenDB). Dovrò testare come non vorrei che nessun utente abbia i diritti di modifica/scrittura sull'intera cartella dell'applicazione.

4

È necessario assicurarsi che il proprio CreateControllerFactory venga eseguito una sola volta, anche in presenza di richieste simultanee all'avvio dell'app.

+0

Grazie a Ayende, l'errore si è rivelato essere un problema di autorizzazioni. Ho dato l'accesso di modifica e scrittura della cartella principale della mia applicazione al gruppo IIS_IUSRS e ciò ha permesso l'inizializzazione corretta del database. Terrò la tua risposta anche nel caso in cui il problema si ripresenti. Lavoro fantastico su RavenDB, questa è la nostra prima avventura in un database non relazionale, quindi siamo ansiosi di vedere come funziona. – kingrichard2005