2011-02-09 16 views
2

,我发现了以下情况例外,当我尝试使用服务帐户凭据启动nservicebus.host.exe:服务帐户上NServiceBus启动投掷SQLiteException

Database was not configured through Database method. 
System.Data.SQLite.SQLiteException: Unable to open the database file 
at System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) 
at System.Data.SQLite.SQLiteConnection.Open() 
at NHibernate.Connection.DriverConnectionProvider.GetConnection() in :line 0 
at NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Prepare() in :line 0 
at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect dialect, IConnectionHelper connectionHelper) in :line 0 
at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactory sessionFactory) in :line 0 
at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) in :line 0 
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in D:\dev\fluent-nhibernate\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 93 
--- End of inner exception stack trace --- 
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in D:\dev\fluent-nhibernate\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 100 
at NServiceBus.SagaPersisters.NHibernate.Config.Internal.SessionFactoryBuilder.Build(IDictionary^2 nhibernateProperties, Boolean updateSchema) in c:\Dev\DotNet\NServiceBus\src\impl\SagaPersisters\NHibernateSagaPersister\NServiceBus.SagaPersisters.NHibernate.Config\Internal\SessionFactoryBuilder.cs:line 48 
--- End of inner exception stack trace --- 
at NServiceBus.SagaPersisters.NHibernate.Config.Internal.SessionFactoryBuilder.Build(IDictionary^2 nhibernateProperties, Boolean updateSchema) in c:\Dev\DotNet\NServiceBus\src\impl\SagaPersisters\NHibernateSagaPersister\NServiceBus.SagaPersisters.NHibernate.Config\Internal\SessionFactoryBuilder.cs:line 55 
at NServiceBus.ConfigureNHibernateSagaPersister.NHibernateSagaPersister(Configure config, IDictionary^2 nhibernateProperties, Boolean autoUpdateSchema) in c:\Dev\DotNet\NServiceBus\src\impl\SagaPersisters\NHibernateSagaPersister\NServiceBus.SagaPersisters.NHibernate.Config\ConfigureNHibernateSagaPersister.cs:line 80 
at Ibfx.BackOffice.Services.NewAccounts.NewAccountsEndpoint.Init() in C:\Dev\TFS\Omega\Src\Svcs\NewAccounts\Src\Service\NewAccountsEndpoint.cs:line 67 
at NServiceBus.Host.Internal.GenericHost.Start() in c:\Dev\DotNet\NServiceBus\src\host\NServiceBus.Host\Internal\GenericHost.cs:line 56 

一切工作正常,如果我用我自己的运行主机帐户,但是如果我使用域凭据将主机作为服务运行,或者使用RunAs命令使用相同凭据,则会出现上述异常。我需要配置什么权限才能使服务起作用?

这里是我的配置:

 var configure = NServiceBus.Configure.With() 
      .Log4Net<Log4NetLoggerAdapter>(a => { }) 
      .UnityBuilder(container) 
      .XmlSerializer() 
      .RijndaelEncryptionService() 
      .MsmqTransport() 
       .IsTransactional(false) 
       .PurgeOnStartup(false) 
       .MsmqSubscriptionStorage(); 

     configure.Configurer.ConfigureComponent<MsmqSubscriptionStorage>(
        ComponentCallModelEnum.None).ConfigureProperty(p => p.DontUseExternalTransaction 
        , true 
       ); 

     IBus bus = configure.UnicastBus() 
      .ImpersonateSender(true) 
      .LoadMessageHandlers() 
      .Sagas() 
      .NHibernateSagaPersister() 
     .CreateBus() 
     .Start(); 

而且我有以下内容的NServiceBus.Host.exe.config文件:

< XML版本= “1.0” 编码= “UTF-8” ? > <配置> <启动useLegacyV2RuntimeActivationPolicy = “真” > < supportedRuntime版本= “V4.0”/ > < /启动> < /配置>

+0

绝对是一个权限问题,我将服务帐户添加到本地管理员组,一切正常。任何人都知道我需要设置什么权限? – 2011-02-09 23:58:07

+0

当我撤销管理员权限,但授予完全控制文件夹上的用户我得到“尝试写入只读数据库”错误。顺便说一句,该服务安装在“程序文件夹”目录中。但是,它被安装为作为服务运行,并且我已检查它是否具有“以服务身份登录”的权限。 – 2011-02-10 00:24:32

回答

2

会发生什么事,当你暂时给大家,并匿名登录完全控制指定的目录?如果解决了这个例外,那绝对是一个安全问题。你在使用| DataDirectory |在你的连接字符串?您确定该流程实际上是在查看您认为正在查看的目录吗?

在此之后,我会尝试使用内存连接字符串设置SQLite的,看它是否能够至少创建一个数据库,并使用它:

":memory:;Version=3;New=True;Pooling=True;Max Pool Size=1;"

上面的字符串在内存中的SQLite但保持打开单个连接,以便表和数据继续存在,直到进程退出。

我将使用的另一个策略是将saga persister更改为另一个SQL flavor,例如MS SQL,以查看是否可以解决此问题。