2012-04-24 18 views
10

Tengo una aplicación ASP.Net MVC 3 que desarrollé y que usa RavenDB Embedded como una memoria de respaldo integrada para datos, utilicé el tutorial this como base para comenzar a crear una aplicación MVC con RavenDB Embedded. He sido capaz de ejecutarlo bien en mi PC de desarrollo, pero cuando llegó el momento de pasarlo en nuestro servidor web IIS 6 que ejecuta Windows Server 2003 que arrojó el siguiente error:Problema de implementación de 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

El origen del error en la clase CompositionRoot.cs a la que se hace referencia es cuando se inicializa la Tienda de documentos incorporable.

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

¿Por qué esto solo sucede en el servidor web y no en mi PC de desarrollo? No estoy seguro de cuál es la causa exacta. Cualquier ayuda es apreciada.

+0

suena como un clásico problema de permisos que se ejecuta bajo IIS. No estoy familiarizado con RavenDB incrustado, pero lo movería fuera de \ webroot y otorgaría los privilegios de usuario de IIS a esa ruta. – kenny

+0

¿RavenDB ya se está ejecutando como servicio o desde la línea de comandos? – wal

Respuesta

15

Esto resultó ser un problema de permisos, di al grupo IIS_IUSRS modificar y escribir permisos en la raíz de la carpeta de mi aplicación y eso le dio los permisos necesarios para inicializar la base de datos correctamente. Probablemente haya una carpeta específica dentro de la raíz a la que necesite modificar/escribir el acceso (en mi caso, probablemente la carpeta App_Data, ya que es donde estoy instanciando mi instancia de RavenDB). Tendré que probar, ya que no me gustaría que ningún usuario tenga derechos de modificación/escritura en toda la carpeta de la aplicación.

4

Debe asegurarse de que su CreateControllerFactory se ejecutará solo una vez, incluso ante solicitudes simultáneas al inicio de la aplicación.

+0

Gracias Ayende, el error resultó ser un problema de permisos. Proporcioné acceso de modificación y escritura de la carpeta raíz de mi aplicación al grupo IIS_IUSRS y eso permitió que la base de datos se inicializara correctamente. También tendré presente su respuesta en caso de que vuelva a surgir el problema. Fantástico trabajo en RavenDB, esta es nuestra primera incursión en una base de datos no relacional, por lo que estamos ansiosos por ver cómo funciona. – kingrichard2005

Cuestiones relacionadas