2012-04-24 18 views
10

RavenDB Embeddedをデータ用のバッキングストアとして使用して開発したASP.Net MVC 3アプリがあります。thisチュートリアルをRavenDB EmbeddedでMVCアプリケーションを作成するための基礎として使用しました。私は私の開発用PC上で罰金それを実行することができましたが、それはIIS6を実行している当社のWindows Server 2003のWebサーバーにデプロイする時間が来たときには、次のエラー投げた: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

に、エラーの原因を参照されるCompositionRoot.csクラスは、埋め込み可能なドキュメントストアの初期化時です。

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

なぜ私の開発用PCではなくウェブサーバー上でのみ起こっていますか?私は正確な原因が何であるかはわかりません。どんな助けもありがとうございます。

+0

は、IISで実行される従来のアクセス許可の問題のようです。 RavenDBが組み込まれていることはよく知っていませんが、\ webrootの外に移動して、そのパスにIISユーザーの特権を与えます。 – kenny

+0

は既にサービスとして、またはコマンドラインからRavenDBを実行していますか? – wal

答えて

15

これは権限の問題であることが判明しました。私はIIS_IUSRSグループに自分のアプリケーションのフォルダのルートに対するアクセス権を変更して書き込みを許可し、データベースの初期化に必要な権限を与えました。おそらく、RavenDBのインスタンスをインスタンス化しているので、私の場合はおそらくApp_Dataフォルダに変更/書き込みアクセスが必要なルート内の特定のフォルダがあります。ユーザーがアプリケーションフォルダ全体に対して変更/書き込み権限を持つことを望まないので、私はテストする必要があります。

4

あなたのCreateControllerFactoryは、アプリの起動時に同時リクエストがあっても一度だけ実行する必要があります。

+0

Ayendeありがとうございます。このエラーは権限の問題であることが判明しました。私はアプリケーションのルートフォルダの変更と書き込みアクセスをIIS_IUSRSグループに与えて、データベースを正しく初期化できるようにしました。問題が再び起こった場合に備えて、私はあなたの答えを念頭に置いておきます。 RavenDBの素晴らしい仕事ですが、これは非リレーショナルデータベースへの最初のベンチャーであり、どのように動作するのか心配です。 – kingrichard2005

関連する問題