Obtention de «Erreur de création automatique de fichier de base de données SQLExpress» pour un site utilisant AspNetSqlMembershipProvider, mais la chaîne de connexion est vers SQL Server 2005

StackOverflow https://stackoverflow.com/questions/1402430

Question

J'ai un site Web ASP.NET v2.0 (pas une application Web) dans lequel le répertoire racine est public, mais "& Admin; Admin". Le sous-répertoire nécessite une authentification. Tout dans la configuration est très générique: j'ai utilisé une chaîne de connexion définie dans le répertoire racine web.config et le fournisseur standard AspNetSqlMembershipProvider , et j'utilise le contrôle de connexion ASP.NET.
Le fichier web.config dans le répertoire Admin indique que l'utilisateur doit disposer de la mention " Admin " rôle.

J'utilise SQL Server 2008 et ma chaîne de connexion est correcte; chaque page de niveau racine est axée sur les données et elles fonctionnent toutes correctement.
La configuration du fournisseur semble aller bien.

lorsque je me connecte, le contrôle de connexion est "& <;> code> OnLoggedIn ". feux d’événement.
La dernière ligne de ce code d'événement me redirige vers la page Admin / Default.aspx . Mon point d'arrêt dans " OnLoggedIn " me montre que tout va bien jusqu'à ce que la redirection vers mon répertoire d'administration ... et ensuite ...

... et ensuite j'attends ... et attend ...

Ensuite, un message d'erreur me dit qu'une " erreur d'auto-création de fichier de base de données SQLExpress ." a été détectée. "

Pourquoi dans le monde tente-t-il soudain de créer un fichier SQL Server Express? Pourquoi ignore-t-il soudainement ma chaîne de connexion?

Un indice étrange: juste avant la dernière ligne de l'option "OnLoggedIn". événement que je mets dans ceci:

bool blnTest = User.IsInRole("Admin");

Je voulais voir si blnTest = true .
Qu'est-ce qui se passe est que le processus frappe cette ligne ... et attend ... et finalement me dit qu'il ne peut pas accéder à la base de données SQL Server Express. Il semble que toute référence (dans mon code ou en coulisse) pour déterminer le rôle de l'utilisateur appelle la mauvaise base de données.

EDIT: Argh, parfois il attend quand je teste blnTest. D'autres fois, la valeur est immédiatement signalée comme "false".

Était-ce utile?

La solution

Selon votre commentaire, il semble que vous n'avez pas explicitement configuré de fournisseur de rôle pour votre site.

Si tout ce qui se trouve dans votre web.config est:

<roleManager enabled="true" />

Vous vous appuyez ensuite sur les fournisseurs par défaut déclarés plus haut dans la hiérarchie de configuration (machine.config, global web.config, etc.)

Dans machine.config, vous avez probablement quelque chose comme:

<roleManager>
  <providers>
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="LocalSqlServer" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    <add name="AspNetWindowsTokenRoleProvider" 
      applicationName="/" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Comme vous pouvez le constater, le premier fournisseur est configuré pour utiliser un connectionString appelé LocalSqlServer - qui est également généralement déclaré dans le fichier machine.config:

<add name="LocalSqlServer" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient"/>

Et ceci est conçu pour utiliser une base de données locale basée sur des fichiers qui sera créée si elle n'existe pas déjà.

Donc, pour que les rôles fonctionnent sur votre site, vous devez modifier votre racine web.config en quelque chose comme:

<roleManager enabled="true">
  <providers>
    <clear />
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="YourConnectionStringName" 
      applicationName="/" 
      type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

Utilisation de < clear / > L'élément supprimera tous les fournisseurs précédemment définis pour ce type.

Autres conseils

Lorsque vous spécifiez l'option AttachDBFilename dans la chaîne de connexion, vous demandez en fait votre instance SQL Server configurée à la demande de l'utilisateur, tout simplement à temps, également appelée "instance utilisateur". Cette instance est créée en demandant à l’instance «maître» (l’instance. \ SQLEXPRESS) de mettre en service une instance enfant, ce qui implique de copier le maître / modèle / msdb dans votre profil, en démarrant un nouveau processus SQL Server sous votre compte configuré pour utiliser le système. fraîchement copié maître / modèle / msdb, puis demandant à cette instance 'enfant' de joindre le 'fichier' spécifié en tant que nouvelle base de données. Les détails sont expliqués dans Instances utilisateur SQL Server 2005 Express Edition .

Le processus de création d’une instance enfant est extrêmement fragile et lorsqu’il casse l’appel de base de données, il en résulte une erreur de temporisation lors de l’ouverture de la connexion. Dans votre cas, il semble que le processus soit interrompu dans certains cas (lorsque vous atteignez la partie protégée du site). Pourquoi ça casse, il est très difficile de deviner sans une information adéquate. Examinez les problèmes courants de l'article lié et déterminez s'il en existe un qui vous concerne. Consultez également le journal des événements système pour savoir si les instances enfants ne peuvent pas démarrer ou si le fichier MDF n'est pas ouvert. Notez qu’une erreur courante consiste à demander le même fichier physique avec AttachDBFilename sous des informations d’identification différentes: chaque information d’identification démarrera sa propre instance 'enfant' et seule la première réussira à attacher la base de données souhaitée.

J'ai eu le même problème en raison de la désactivation des services pour le serveur SQL.

Vérifiez sous services.msc pour voir si le service sqlexpress est en cours d'exécution. Si c'est le cas, vérifiez si SQL Express est installé sur votre ordinateur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top