.NET 4.0实体框架超时已过期

10
我正在使用MVC3、.NET框架4.0和Entity Framework开发ASP.NET网站。当我运行应用程序并对SQL Server 2005数据库执行简单的查询时,会出现以下错误:
"A System.Data.SqlClient.SqlException was thrown: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."
问题在于,我尝试登录并从管理工具执行相同的查询,它可以正常工作。我使用.NET框架4.0和实体框架开发了一个小型控制台应用程序,执行完全相同的查询,并返回所需的信息。我甚至从Entity Framework切换到ADO.NET类(SqlConnection和SqlCommand),当从SqlCommand实例执行选择时,我获得完全相同的错误。
当我使用实体框架创建模型时,我能够通过向导连接到数据库,并且一切正常。我没有遇到任何问题并成功创建了所有类。
请不要告诉我解决方案是增加任何超时,因为查询非常小(最多20条记录),而且就像我之前说过的,当我从使用相同技术(甚至是放置在下面的相同代码)的控制台应用程序运行时,它可以正常工作。
这是给我带来问题的代码:
MLIBEntities dbMLIB = new MLIBEntities();

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

return searchResults.ToList();

运行 searchResults.ToList() 时,会抛出异常。

这是我实体类使用的连接字符串。我确定它使用了连接字符串,因为我故意添加了语法错误,然后它们被检测到了。

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

我猜想这一定是MVC Web应用程序中的配置问题,或者是我在Web.config文件中遗漏了某些东西。你们有没有遇到过这个问题?我知道这真的很奇怪。

谢谢你们的帮助。我已经没有任何想法了。

最后,我运行了SQL分析器,似乎查询从未到达数据库服务器。你们有什么想法为什么会发生这种情况吗?


它是否在200秒后实际超时? - user1228
真的,与ASP.NET MVC 3没有关系。 - Darin Dimitrov
SQL Server 是本地的还是在网络上? - Tomas Voracek
你是说有些查询可以工作,但searchResults查询不能工作?你在控制台应用程序中使用了与Web/Config文件中相同的connectionStrings部分吗?当你使用ADO.NET Core时,你使用了什么连接字符串? - Shiv Kumar
我在应用程序中只有一个查询,就是放在上面的那个。它在MVC应用程序中不起作用,但在控制台应用程序中完美运行。我在控制台应用程序的app/config文件中使用了与web/config文件中相同的连接字符串部分。当我使用ADO.NET核心时使用的连接字符串是这里放置的字符串:Data Source=HERPADERP;Initial Catalog=MLIB;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=200。 - Alvos
显示剩余2条评论
4个回答

3
我曾经遇到过同样的问题,后来又出现了另一个与MSSQL无关的问题。为了解决第一个问题(运行查询太慢),我将command.CommandTimeout更改为较大的数字(默认为30)。另一个出现的问题是,当我使用定时任务运行此应用程序时,在20分钟后会抛出错误。

"Thread was being aborted"

在查看日志错误后,发现应用程序池也有超时限制,默认值为20分钟。


3
在Entity Framework中,如果您希望成为提供程序无关的,可以将ObjectContext.CommandTimeout设置为延长超时时间。http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.commandtimeout.aspx - jkelley

2

可能会出现超时的情况,但这可能只是一个安全问题。

我的第一反应是您正在使用Windows身份验证(Integrated Security=True)进行连接,而网站正在运行在没有有效登录该服务器的帐户(Network Service?)下。

我的第二个想法是Sql Server位于另一台机器上,并且存在防火墙问题。

第三个想法是Sql Server未配置为接受通过TCPIP的网络连接。运行Sql Server Configuration Manager并确保其正在监听。


1
但他能够从ConsoleApp连接,所以问题必须在其他地方。 - Tomas Voracek
1
@Tomas He 是使用他的用户帐户从控制台应用程序进行连接。ASP.NET 运行在不同的帐户下,所以你是错误的。 - user1228
1
你是完全正确的。在写了评论之后,我意识到了这一点。谢谢。 - Tomas Voracek

0

感谢大家的帮助。看起来查询确实返回了大量记录,并且在从 Web 应用程序运行它时导致超时,而在控制台应用程序中由于其性质而没有发生这种情况。

再次感谢!


控制台应用程序将在大约相同的时间检索相同数量的记录。查询数据库的不是应用程序,而是数据库和/或记录本身。 - Jeff LaFay
你说得对,那里确实有些可疑。我优化了查询,问题得到了解决。谢谢。 - Alvos

0

我已经在连接字符串中使用了MultipleActiveResultSets=True,出现了超时问题,尝试关闭它以查看是否是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接