【问题标题】:RavenDB deployment issueRavenDB 部署问题
【发布时间】:2012-04-24 23:30:54
【问题描述】:

我开发了一个 ASP.Net MVC 3 应用程序,它使用 RavenDB Embedded 作为数据的集成后备存储,我使用 this 教程作为开始使用 RavenDB Embedded 创建 MVC 应用程序的基础。我已经能够在我的开发 PC 上正常运行它,但是当需要将它部署到运行 IIS6 的 Windows Server 2003 Web 服务器上时,它抛出了以下错误:

无法访问文件,文件被锁定或正在使用 描述:一个 当前 web 执行过程中发生未处理的异常 要求。请查看堆栈跟踪以获取有关 错误以及它起源于代码的位置。

异常详情: Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException:不能 访问文件,文件被锁定或正在使用中

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[EsentFileAccessDeniedException: 无法访问文件,该文件是 锁定或正在使用] 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:无法打开事务存储: 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..ctor() 在 ..\MyApp\CompositionRoot.cs:17
...MyApp\Global.asax.cs:38 中的 MyApp.MvcApplication.Application_Start()

[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 上下文)+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 下运行的经典权限问题。不熟悉嵌入的 RavenDB,但我会将其移到 \webroot 之外并为 IIS 用户提供该路径的权限。
  • RavenDB 是否已经作为服务或命令行运行?

标签: asp.net-mvc asp.net-mvc-3 ravendb


【解决方案1】:

这原来是一个权限问题,我授予 IIS_IUSRS 组修改和写入我的应用程序文件夹根目录的权限,并授予它正确初始化数据库所需的权限。根目录中可能有一个特定的文件夹需要修改/写入访问权限(在我的情况下,可能是 App_Data 文件夹,因为这是我实例化 RavenDB 实例的地方)。我必须进行测试,因为我不希望任何用户拥有对整个应用程序文件夹的修改/写入权限。

【讨论】:

    【解决方案2】:

    您需要确保您的 CreateControllerFactory 只运行一次,即使在应用启动时面对并发请求也是如此。

    【讨论】:

    • 感谢 Ayende,错误原来是权限问题。我将我的应用程序根文件夹的修改和写入权限授予 IIS_IUSRS 组,这使得数据库能够正确初始化。我也会记住你的答案,以防问题再次出现。在 RavenDB 上的出色工作,这是我们第一次涉足非关系数据库,所以我们很想看看它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多