2011-02-07 17 views
10

Sto sviluppando un sito Web ASP.NET utilizzando MVC3, .NET framework 4.0 ed Entity Framework. Quando eseguo l'applicazione ed eseguo una semplice selezione su un database di SQL Server 2005, viene visualizzato il seguente errore:.NET 4.0 Timeout del framework Entity scaduto

"È stata generata una System.Data.SqlClient.SqlException:" Timeout scaduto. Il periodo di timeout è scaduto prima del completamento dell'operazione o il server non risponde. "

Questa è la cosa, ho provato ad accedere e ad eseguire la stessa query dallo studio di gestione e ha funzionato. .NET framework 4.0 e framework di entità che eseguono esattamente la stessa query e restituiscono le informazioni necessarie. Sono persino passato dall'utilizzo di Entity framework alle classi ADO.NET (SqlConnection e SqlCommand) e quando si esegue la selezione dall'istanza SqlCommand ottengo l'esatto lo stesso errore

Quando ho creato il modello utilizzando il framework di entità, sono riuscito a connettermi dalla procedura guidata al database e ha funzionato correttamente. Ho ottenuto tutte le classi create senza problemi

Si prega di non dirmi la soluzione è di aumentare qualsiasi timeout perché la query è molto piccola (20 record in alto) e come ho detto prima funzionava bene quando si esegue da un'applicazione console utilizzando la stessa tecnologia e anche la stessa codice posto sotto.

Questo è il codice dandomi il problema:

MLIBEntities dbMLIB = new MLIBEntities(); 

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

return searchResults.ToList(); 

L'eccezione viene generata durante l'esecuzione searchResults.ToList();

Questa è la mia stringa di connessione utilizzata dalle classi di entità. Sono sicuro che usa la stringa di connessione dato che l'ho modificata con errori di sintassi e sono stati rilevati.

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

Sto indovinando questo deve essere un problema di configurazione da qualche parte nella applicazione web MVC o sto solo perdendo qualcosa nel file web.config. Qualcuno di voi ha avuto questo problema? So che è davvero strano.

Grazie per il vostro aiuto. Sono davvero senza idee.

Un'ultima cosa. Ho eseguito il profiler SQL e sembra che la query non arrivi mai al server del database. Qualche idea del perché questo potrebbe accadere?

+0

Timeout effettivo dopo 200 secondi? – Will

+0

In realtà, nessuna relazione con ASP.NET MVC 3. –

+0

SQL Server è locale o sulla rete? –

risposta

0

Grazie a tutti per il vostro aiuto. Sembra che la query stia effettivamente restituendo una quantità enorme di record e stava causando un timeout durante l'esecuzione dall'applicazione Web mentre non stava accadendo nell'applicazione console data la sua natura.

Grazie ancora!

+0

L'applicazione console recupera la stessa quantità di record all'incirca alla stessa ora. Non è quale applicazione sta interrogando il database, è il database e/o i record. – jlafay

+0

hai ragione, c'era qualcosa di strano lì. Ho ottimizzato la query e risolto il problema. Grazie. – Alvos

2

Questo potrebbe apparire come un timeout, ma è probabilmente solo un problema di sicurezza.

Il mio primo istinto è che ci si connette utilizzando l'autenticazione di Windows (Integrated Security = True) e il sito Web è in esecuzione con un account (servizio di rete?) Che non ha un accesso valido per quel server.

Il mio secondo istinto è che il server Sql si trova su una macchina diversa e c'è un problema con il firewall.

Terzo istinto: il server Sql non è configurato per accettare connessioni di rete su TCPIP. Esegui Gestione configurazione server Sql e assicurati che sia in ascolto.

+1

Ma era in grado di connettersi da ConsoleApp, quindi il problema deve essere altrove. –

+1

@Tomas Si connette da un'app console sotto il proprio account utente. ASP.NET viene eseguito con un account diverso, quindi non sei corretto. – Will

+1

Hai completamente ragione. L'ho capito dopo aver scritto un commento. Grazie –

0

ho già avuto timeout con MultipleActiveResultSets = True nella stringa di connessione, provare a spegnerlo per vedere se è il problema

3

Ho avuto lo stesso problema e un altro anche apparso più tardi, non legati alla MSSQL. Per risolvere il primo problema (l'esecuzione di query ha richiesto troppo tempo), ho modificato command.CommandTimeout per utilizzare un numero maggiore (l'impostazione predefinita è 30). Un altro problema che si presentò era quando ho usato un'operazione pianificata per eseguire questa applicazione - dopo 20 minuti è l'errore

"Thread was being aborted"

avrebbe gettato Dopo aver esaminato gli errori di registro, è venuto fuori che il pool di applicazioni ha anche il timeout, e il valore predefinito è 20 minuti.

+3

Anche in EF, è possibile impostare ObjectContext.CommandTimeout per estendere il timeout se si desidera essere indipendenti dal provider. http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.commandtimeout.aspx – jkelley

Problemi correlati