Obtención del "error de creación automática del archivo de base de datos SQLExpress" para el sitio que utiliza AspNetSqlMembershipProvider, pero la cadena de conexión es a SQL Server 2005

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

Pregunta

Tengo un sitio web ASP.NET v2.0 (no aplicación web) donde el directorio raíz es público, pero el " Admin " El subdirectorio requiere autenticación. Todo acerca de la configuración es muy genérico: usé una cadena de conexión definida en root web.config y el proveedor estándar AspNetSqlMembershipProvider , y estoy usando el control de inicio de sesión de ASP.NET.
El archivo web.config en el directorio de Admin especifica que el usuario debe tener el " Admin " papel.

Estoy usando SQL Server 2008 , y mi cadena de conexión es buena; cada página de nivel raíz está basada en datos y todas funcionan bien.
La configuración del proveedor parece buena.

cuando inicio sesión, el control de inicio de sesión " OnLoggedIn " evento de incendios.
La última línea en ese código de evento me redirige a mi página Admin / Default.aspx . Mi punto de interrupción en " OnLoggedIn " me muestra que todo está bien hasta que se redirija a mi directorio de administradores ... y luego ...

... y luego espero ... y espero ...

Y luego recibo un error que me dice que ha experimentado un " SQLExpress error de creación automática del archivo de base de datos . "

¿Por qué demonios está intentando de repente crear un archivo de SQL Server Express? ¿Por qué de repente se ignora mi cadena de conexión?

Una pista extraña: justo antes de la última línea de " OnLoggedIn " Evento que pongo en esto:

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

Quería ver si blnTest = true .
Lo que sucede es que el proceso llega a esta línea ... y espera ... y, finalmente, me dice que no puede acceder a la base de datos de SQL Server Express. Parece que cualquier referencia (ya sea en mi código, o entre bastidores) para determinar el rol del usuario, llama a la base de datos incorrecta.

EDITAR: Argh, a veces espera cuando pruebo blnTest. Otras veces, el valor se reporta inmediatamente como " false. & Quot;

¿Fue útil?

Solución

Según su comentario, parece que no ha configurado explícitamente un proveedor de roles para su sitio.

Si todo lo que está en tu web.config es:

<roleManager enabled="true" />

Entonces, usted confía en los proveedores predeterminados declarados más arriba en la jerarquía de configuración (machine.config, global web.config, etc.)

En machine.config probablemente tengas algo como:

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

Como puede ver, el primer proveedor está configurado para usar una cadena de conexión llamada LocalSqlServer, que generalmente también se declara en machine.config:

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

Y esto está diseñado para usar una base de datos local basada en archivos que se creará si no existe.

Por lo tanto, para que los roles funcionen en su sitio, debe modificar su raíz web.config a algo como:

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

Usando la etiqueta < clear / > El elemento eliminará todos los proveedores definidos previamente para ese tipo.

Otros consejos

Cuando especifique la opción AttachDBFilename en la cadena de conexión, de hecho, está solicitando su instancia de SQL Server muy apta para el aprovisionamiento del tiempo, también conocida como "instancia de usuario". Esta instancia se crea solicitando a la instancia 'maestra' (la instancia. \ SQLEXPRESS) que provea una instancia secundaria, lo que implica copiar el maestro / modelo / msdb en su perfil, iniciando un nuevo proceso de SQL Server en su cuenta configurada para usar copiado recientemente master / model / msdb, luego se le pide a esta instancia 'secundaria' que adjunte el 'archivo' especificado como una nueva base de datos. Los detalles se explican en Instancias de usuario de SQL Server 2005 Express Edition .

El proceso de creación de una instancia secundaria es extremadamente frágil y cuando rompe los resultados de la llamada a la base de datos, finalmente se produce un error de tiempo de espera al abrir la conexión. En su caso, parece que el proceso se interrumpe en algunos casos (cuando llega a la parte protegida del sitio). Por qué se rompe, es muy difícil de adivinar sin información adecuada. Mire los Problemas comunes en el artículo vinculado y vea si alguno se aplica a usted. También revise el registro de eventos del sistema para ver si hay algún mensaje por qué las instancias secundarias no pueden iniciarse o no puede abrir el archivo MDF. Tenga en cuenta que un error común es solicitar el mismo archivo físico con AttachDBFilename con diferentes credenciales: cada credencial iniciará su propia instancia 'secundaria' y solo la primera logrará adjuntar la base de datos deseada.

Tuve el mismo problema que se debió a que los servicios para el servidor SQL estaban deshabilitados.

Verifique en services.msc para ver si el servicio sqlexpress se está ejecutando. Si es así, compruebe si tiene instalado SQL Express en su máquina

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top