Asp.net-Mvc

RavenDB 部署問題

  • January 8, 2013

我有一個我開發的 ASP.Net MVC 3 應用程序,它使用 RavenDB Embedded 作為數據的集成備份儲存,我使用教程作為開始使用 RavenDB Embedded 創建 MVC 應用程序的基礎。我已經能夠在我的開發 PC 上正常執行它,但是當需要將它部署到執行 IIS6 的 Windows Server 2003 Web 伺服器上時,它拋出了以下錯誤:

無法訪問文件,文件被鎖定或正在使用 描述:在執行目前 Web 請求期間發生未處理的異常。請查看堆棧跟踪以獲取有關錯誤及其源自程式碼的位置的更多資訊。

異常詳細資訊:Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException:無法訪問文件,文件已鎖定或正在使用

源錯誤:

在執行目前 Web 請求期間生成了未處理的異常。可以使用下面的異常堆棧跟踪來辨識有關異常起源和位置的資訊。

堆棧跟踪:

$$ EsentFileAccessDeniedException: Cannot access file, the file is locked or in use $$ Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) 在 C:\Work\ravendb\SharedLibs\Sources\managedesent-61618\EsentInterop\Api.cs:2736 Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator ) 在 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) 在 c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:222 Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration 配置) 在 c:\ Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:185

Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() 在 c:\Builds\RavenDB-Stable\Raven.Client.Embedded\EmbeddableDocumentStore.cs:143 Raven.Client .Document.DocumentStore.Initialize() 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\DocumentStore.cs:496 MyApp.CompositionRoot.CreateControllerFactory() 在 …\MyApp\CompositionRoot.cs:36 ..\MyApp\CompositionRoot.cs:17 中的 MyApp.CompositionRoot..ctor()

…MyApp\Global.asax.cs:38 中的 MyApp.MvcApplication.Application_Start() $$ 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$$ $$處理程序)+191

System.Web.HttpApplication.InitSpecial(HttpApplicationState 狀態,MethodInfo$$ $$處理程序,IntPtr appContext,HttpContext 上下文)+325

System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+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 上下文)+11524352 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext 上下文)+141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest WR,HttpContext 上下文)+4782309

引用的 CompositionRoot.cs 類中的錯誤來源是初始化 Embeddable Document Store 時。

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

為什麼這只發生在 Web 伺服器上而不是我的開發 PC 上?我不確定確切的原因可能是什麼。任何幫助表示讚賞。

原來這是一個權限問題,我給 IIS_IUSRS 組修改和寫入我的應用程序文件夾根目錄的權限,並賦予它正確初始化數據庫所需的權限。根目錄中可能有一個特定的文件夾需要對其進行修改/寫入訪問(在我的情況下,可能是 App_Data 文件夾,因為我正在實例化我的 RavenDB 實例)。我必須進行測試,因為我不希望任何使用者擁有對整個應用程序文件夾的修改/寫入權限。

引用自:https://stackoverflow.com/questions/10307432