2011-02-09 2 views
2

je commence à l'exception suivante lorsque je tente de démarrer nservicebus.host.exe avec des informations d'identification de compte de service:compte de service lancer SQLiteException au démarrage NServiceBus

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 

Tout fonctionne bien si je lance l'hôte en utilisant mon propre compte, mais si j'exécute l'hôte en tant que service avec des informations d'identification de domaine ou si j'utilise ces mêmes informations d'identification avec la commande RunAs, j'obtiens l'exception ci-dessus. Quelles sont les autorisations que je dois configurer pour que le service fonctionne?

Voici ma config:

 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(); 

Et j'ai un fichier NServiceBus.Host.exe.config avec les éléments suivants:

< xml version = "1.0" encoding = "utf-8" ? > <configuration> < démarrage useLegacyV2RuntimeActivationPolicy = "true" > < version supportedRuntime = "v4.0"/> </démarrage > </configuration >

+0

définitivement un problème d'autorisations, j'ai ajouté le compte de service au groupe administrateur local et tout fonctionne correctement. Quelqu'un sait quelles autorisations je dois définir? –

+0

lorsque je révoque les autorisations d'administration, mais accorder le contrôle total à l'utilisateur sur le dossier, je reçois l'erreur "tentative d'écriture dans la base de données readonly". BTW le service est installé dans le répertoire "Program Folders". Cependant, il a été installé pour fonctionner en tant que service et j'ai vérifié qu'il a l'autorisation de "se connecter en tant que service". –

Répondre

2

Qu'est-ce qui se passe lorsque vous temporairement et donnez TOUT LE MONDE ANONYMOUS LOGON Contrôle total sur le répertoire spécifié? Si cela résout l'exception, c'est définitivement un problème de sécurité. Utilisez-vous | DataDirectory | dans votre chaîne de connexion? Êtes-vous sûr que le processus regarde réellement le répertoire que vous pensez qu'il regarde?

Après cela, je voudrais essayer d'utiliser SQLite dans les paramètres de chaîne de connexion de mémoire pour voir si elle est en mesure d'au moins créer une base de données et de l'utiliser:

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

La chaîne ci-dessus utilise SQLite en mémoire mais conserve une seule connexion ouverte afin que les tables et les données continuent d'exister jusqu'à la fermeture du processus.

Une autre stratégie que j'utiliserais est de changer la saga persister à une autre saveur SQL, comme MS SQL pour voir si cela résout.

+1

a tiré sur Filemon et l'a confirmé. Il essayait de créer la base de données sqlite dans \ Windows \ System32. J'ai changé la chaîne de connexion pour utiliser "source de données = | DataDirectory | \ sagas.sqlite; ......" et cela l'a corrigé. Comme toujours, merci Jonathan! –

Questions connexes