Ottenere & # 8220; Errore di creazione automatica del file di database SQLExpress & # 8221; per il sito che utilizza AspNetSqlMembershipProvider, ma la stringa di connessione è a SQL Server 2005

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

Domanda

Ho un sito web ASP.NET v2.0 (non un'applicazione web) in cui la directory principale è pubblica, ma il " Admin " la sottodirectory richiede l'autenticazione. Tutto ciò che riguarda l'installazione è molto generico: ho usato una stringa di connessione definita nel root web.config e il provider AspNetSqlMembershipProvider standard e sto usando il controllo di accesso ASP.NET.
Il file web.config nella directory Admin specifica che l'utente deve avere " Admin " ruolo.

Sto usando SQL Server 2008 e la mia stringa di connessione è buona; ogni pagina di livello radice è guidata dai dati e funzionano tutti bene.
La configurazione del provider sembra appiccicosa.

quando eseguo l'accesso, il controllo di accesso è " OnLoggedIn " incendi di eventi.
L'ultima riga di quel codice evento mi reindirizza alla mia pagina Admin / Default.aspx . Il mio punto di interruzione in " OnLoggedIn " mi mostra che va tutto bene fino al reindirizzamento nella mia directory di amministrazione ... e poi ...

... e poi aspetto ... e aspetto ...

E poi ricevo un errore che mi dice che si è verificato un errore " Errore di creazione automatica del file di database SQLExpress . "

Perché nel mondo sta improvvisamente cercando di creare un file SQL Server Express? Perché improvvisamente ignora la mia stringa di connessione?

Un indizio dispari: poco prima dell'ultima riga di " OnLoggedIn " evento che ho inserito in questo:

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

Volevo vedere se blnTest = true .
Quello che succede è che il processo colpisce questa linea ... e attende ... e alla fine mi dice che non può accedere al database di SQL Server Express. Sembra che qualsiasi riferimento (nel mio codice o dietro le quinte) per determinare il ruolo dell'utente, chiami il database sbagliato.

EDIT: Argh, a volte attende quando collaudo blnTest. Altre volte riporta immediatamente il valore come " false. & Quot;

È stato utile?

Soluzione

Secondo il tuo commento, sembra che tu non abbia configurato esplicitamente un provider di ruoli per il tuo sito.

Se tutto ciò che è nel tuo web.config è:

<roleManager enabled="true" />

Quindi fai affidamento sui provider predefiniti dichiarati più avanti nella configurazione hieracrchy (machine.config, global web.config, ecc)

In machine.config probabilmente hai qualcosa del tipo:

<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>

Come puoi vedere, il primo provider è configurato per usare una stringa di connessione chiamata LocalSqlServer - che di solito è anche dichiarata in machine.config:

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

E questo è progettato per utilizzare un database basato su file locale che verrà creato se non esiste già.

Quindi, per far funzionare i ruoli sul tuo sito, dovresti aggiungere il tuo web.config di root a qualcosa del tipo:

<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>

Uso di < clear / > element rimuoverà tutti i provider precedentemente definiti per quel tipo.

Altri suggerimenti

Quando specifichi l'opzione AttachDBFilename nella stringa di connessione, in realtà stai chiedendo la tua istanza di SQL Server con il proprio just-in-time, ovvero "istanza utente". Questa istanza viene creata chiedendo all'istanza "master" (l'istanza. \ SQLEXPRESS) di eseguire il provisioning di un'istanza figlio, il che implica la copia del master / modello / msdb nel profilo, avviando un nuovo processo di SQL Server nell'account configurato per utilizzare il master / model / msdb appena copiato, quindi chiedendo a questa istanza "figlio" di allegare il "file" specificato come nuovo database. I dettagli sono spiegati in Istanze utente di SQL Server 2005 Express Edition .

Il processo di creazione di un'istanza figlio è estremamente fragile e quando interrompe la chiamata al DB si traduce in un errore di timeout all'apertura della connessione. Nel tuo caso sembra che il processo si interrompa in alcuni casi (quando si raggiunge la parte protetta del sito). Perché si rompe, è molto difficile indovinare senza informazioni adeguate. Guarda i Problemi comuni nell'articolo collegato e vedi se ce ne sono. Controllare anche il registro eventi di sistema per eventuali messaggi sui motivi per cui le istanze figlio non possono essere avviate o non possono aprire il file MDF. Si noti che un errore comune è richiedere lo stesso file fisico con AttachDBFilename con credenziali diverse: ogni credenziale avvierà la propria istanza "figlio" e solo la prima riuscirà ad allegare il database desiderato.

Ho avuto lo stesso problema dovuto alla disabilitazione dei servizi per il server sql.

Controlla in services.msc per vedere se il servizio sqlexpress è in esecuzione. Se lo è, controlla se hai sql express installato sul tuo computer

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top