Сервисная учетная запись, генерирующая исключение SQLiteException при запуске NServiceBus - PullRequest
2 голосов
/ 10 февраля 2011

При попытке запустить nservicebus.host.exe с учетными данными учетной записи службы я получаю следующее исключение:

    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 со следующим:

1 Ответ

2 голосов
/ 10 февраля 2011

Что происходит, когда вы временно предоставляете ВСЕМ и АНОНИМНОМУ ЛОГОНУ полный контроль над указанным каталогом?Если это решает исключение, это определенно проблема безопасности.Используете ли вы | DataDirectory |в вашей строке подключения?Вы уверены, что процесс на самом деле просматривает каталог, который, по вашему мнению, просматривает?

После этого я бы попробовал использовать SQLite в настройках строки подключения к памяти, чтобы посмотреть, сможет ли он хотя бы создать базу данныхиспользуйте его:

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

Приведенная выше строка использует SQLite в памяти, но сохраняет одно соединение открытым, так что таблицы и данные продолжают существовать до завершения процесса.

Еще одна стратегия, которую я бы использовал, - это изменить сагу на другую версию SQL, например MS SQL, чтобы посмотреть, решит ли она это.

...