10

RavenDB Embedded をデータの統合バッキング ストアとして使用する ASP.Net MVC 3 アプリを開発しました。RavenDB Embedded を使用した MVC アプリの作成を開始するための基礎として、このチュートリアルを使用しました。開発用 PC では問題なく実行できましたが、IIS6 を実行している Windows Server 2003 Web サーバーに展開すると、次のエラーがスローされました。

ファイルにアクセスできません。ファイルはロックされているか使用中です 説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException: ファイルにアクセスできません。ファイルがロックされているか使用中です

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[EsentFileAccessDeniedException: ファイルにアクセスできません。ファイルがロックされているか使用中です] C:\Work\ravendb\SharedLibs\Sources\managedesent-61618\EsentInterop\Api の Microsoft.Isam.Esent.Interop.Api.Check(Int32 err)。 c:\Builds\RavenDB-Stable\Raven.Storage.Esent\TransactionalStorage.cs:207 の cs:2736 Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator)

[InvalidOperationException: トランザクション ストレージを開けませんでした: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
c:\Builds\RavenDB-Stable\Raven の Raven.Storage.Esent.TransactionalStorage.Initialize(IUuidGenerator uuidGenerator) .Storage.Esent\TransactionalStorage.cs:222 c:\Builds\RavenDB-Stable\Raven.Database\DocumentDatabase.cs:185 の Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration 構成)
c:\Builds\RavenDB-Stable\Raven.Client.Embedded\EmbeddableDocumentStore.cs:143 の Raven.Client.Embedded.EmbeddableDocumentStore.InitializeInternal() c:\Builds\RavenDB の Raven.Client.Document.DocumentStore.Initialize() -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() 内 ...MyApp\Global.asax.cs:38

[HttpException (0x80004005): トランザクション ストレージを開けませんでした: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext コンテキスト、HttpApplication アプリ) +3985477
System.Web.HttpApplication .RegisterEventSubscriptionsWithIIS(IntPtr appContext、HttpContext コンテキスト、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): トランザクション ストレージを開けませんでした: C:\inetpub\wwwroot\MyApp\App_Data\Database\RavenDB\Data]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11524352 System.Web.HttpRuntime.EnsureFirstRequestInit( HttpContext コンテキスト) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr、HttpContext コンテキスト) +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;
}

これが Web サーバーでのみ発生し、開発用 PC では発生しないのはなぜですか? 正確な原因が何であるかはわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

16

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

于 2012-04-25T16:47:23.693 に答える
4

CreateControllerFactoryアプリの起動時に同時リクエストが発生した場合でも、 が 1 回だけ実行されるようにする必要があります。

于 2012-04-25T06:40:13.073 に答える