2011-02-07 150 views
10

Estoy desarrollando un sitio web ASP.NET utilizando MVC3, .NET framework 4.0 y Entity Framework. Cuando ejecuto la aplicación y realizo una selección simple a una base de datos de SQL Server 2005 recibo el siguiente error:.NET 4.0 Entity framework expiró el tiempo de espera

"Se lanzó una excepción System.Data.SqlClient.SqlException:" El tiempo de espera expiró. El tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde "

Esto es lo que intento. Intenté iniciar sesión y realizar la misma consulta desde Management Studio y funcionó. Desarrollé una pequeña aplicación de consola usando .NET framework 4.0 y framework de entidades realizan exactamente la misma consulta y devolvieron la información que necesitaba. Incluso cambié de usar Entity Framework a clases ADO.NET (SqlConnection y SqlCommand) y al ejecutar la selección de la instancia de SqlCommand obtengo la exacta mismo error.

Cuando creé el modelo usando el marco de entidades, pude conectarme desde el asistente a la base de datos y funcionó bien. Obtuve todas las clases creadas sin ningún problema.

Por favor, no me diga que la solución es aumentar el tiempo de espera porque la consulta es muy pequeña (20 registros como máximo) y como dije antes funcionaba bien desde una aplicación de consola usando la misma tecnología e incluso la misma código que coloco a continuación.

Este es el código me da el problema:

MLIBEntities dbMLIB = new MLIBEntities(); 

var searchResults = (from s in dbMLIB.Sets 
        where s.setmap1.StartsWith(accountNumber) 
        select s); 

return searchResults.ToList(); 

La excepción se produce cuando se ejecuta searchResults.ToList();

Esta es mi cadena de conexión que utilizan las clases de entidades. Estoy seguro de que usa la cadena de conexión ya que la modifiqué con errores de sintaxis y se detectaron.

<connectionStrings> 
    <add name="MLIBEntities" connectionString="metadata=res://*/Models.MlibDBModel.csdl|res://*/Models.MlibDBModel.ssdl|res://*/Models.MlibDBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=HERPADERP;Initial Catalog=MLIB;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=200&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

supongo que esto debe ser un problema de configuración en algún lugar de la aplicación web MVC o sólo estoy perdiendo algo en el archivo Web.config. ¿Alguno de ustedes ha tenido este problema? Sé que es realmente extraño.

Gracias por su ayuda. Realmente estoy sin ideas.

Una última cosa. Ejecuté el generador de perfiles SQL y parece que la consulta nunca llega al servidor de la base de datos. ¿Alguna idea de por qué podría estar pasando esto?

+0

¿Se agota el tiempo después de 200 segundos? – Will

+0

Realmente, no tiene relación con ASP.NET MVC 3. –

+0

SQL Server es local o en red? –

Respuesta

0

Gracias a todos por su ayuda. Parece que la consulta devolvió una gran cantidad de registros y estaba causando un tiempo de espera excedido al ejecutarla desde la aplicación web mientras no ocurría en la aplicación de la consola dada su naturaleza.

¡Gracias de nuevo!

+0

La aplicación de consola recuperaría la misma cantidad de registros aproximadamente al mismo tiempo. No es qué aplicación está consultando la base de datos, sino la base de datos y/o los registros. – jlafay

+0

tienes razón, había algo sospechoso allí. Optimicé la consulta y solucionó el problema. Gracias. – Alvos

2

Esto puede aparecer como un tiempo de espera, pero es posiblemente solo un problema de seguridad.

Mi primer instinto es que te estás conectando usando la autenticación de Windows (Seguridad integrada = Verdadero) y el sitio web se ejecuta bajo una cuenta (¿Servicio de red?) Que no tiene un inicio de sesión válido para ese servidor.

Mi segundo instinto es que el servidor Sql está en una máquina diferente, y hay un problema de firewall.

El tercer instinto es que el servidor Sql no está configurado para aceptar conexiones de red a través de TCPIP. Ejecute el Administrador de configuración del servidor Sql y asegúrese de que esté escuchando.

+1

Pero pudo conectarse desde ConsoleApp, por lo que el problema debe ser otro. –

+1

@Tomas Se conecta desde una aplicación de consola bajo su cuenta de usuario. ASP.NET se ejecuta con una cuenta diferente, por lo que es incorrecto. – Will

+1

Tiene toda la razón. Me di cuenta de que después de escribir un comentario. Gracias –

0

ya tenía tiempos de espera con MultipleActiveResultSets = True en la cadena de conexión, trate de apagarlo para ver si es el problema

3

que tenía el mismo problema y otro también apareció más tarde, no relacionado con MSSQL. Para resolver el primer problema (la ejecución de consultas tomó demasiado tiempo), cambié command.CommandTimeout para usar un número mayor (el valor predeterminado es 30). Otro problema que se presentó fue cuando utilicé tarea programada para ejecutar esta aplicación - después de 20 minutos sería lanzado error

"Thread was being aborted"

Después de revisar los errores de registro, se supo que el grupo de aplicaciones también tiene su tiempo de espera, y el valor por defecto es 20 minutos.

+3

También en EF, puede establecer ObjectContext.CommandTimeout para extender el tiempo de espera si desea ser independiente del proveedor. http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.commandtimeout.aspx – jkelley

Cuestiones relacionadas