2017-03-03 88 views
0

我们有一个网站,我们使用ASP.Net的网页内置从SQL Server CE迁移到SQL Server,现在WebSecurity导致SQL超时

我最近迁移从SQL Server CE数据库到SQL Server 2014我这样做是使用我的本地机器上的SQL Server Compact Toolbox,然后将.mdf文件附加到我们的网站主机SQL Server实例。

一切都很好,网站似乎运行良好。然而,不久后,我开始注意到间歇例外,像这样的:

System.Web.HttpUnhandledException(0x80004005的):类型System.Web.HttpUnhandledException“的异常被抛出。

System.Data.SqlClient.SqlException(0x80131904):超时已过期。操作完成之前超时的时间或服务器没有响应。

System.ComponentModel.Win32Exception(0x80004005的):等待操作超时

在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection,行动1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource
1所完成的Int32超时,任务&任务布尔asyncWrite)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,runBehavior runBehavior,布尔returnStream,字符串方法)
在System.Data.SqlClient.SqlCommand.ExecuteScalar()
在WebMatrix.Data。 Database.QueryValue(String commandText,Obje克拉[]参数)
在WebMatrix.WebData.DatabaseWrapper.QueryValue(字符串的CommandText,对象[]参数)
在WebMatrix.WebData.SimpleMembershipProvider.GetUserId(分贝了IDatabase,字符串userTableName,字符串userNameColumn,字符串userIdColumn,字符串username)
在WebMatrix.WebData.SimpleMembershipProvider.GetUser(字符串username,布尔userIsOnline)
在System.Web.Security.Membership.GetUser(字符串username,布尔userIsOnline)
在WebMatrix.WebData.WebSecurity.GetUserId(用户名字符串)
at WebMatrix.WebData.WebSecurity.get_CurrentUserId()
at ASP._Page_Default_cshtml。 <> c__DisplayClass5.b__3()在e:\ web \ givetoru \ Default.cshtml:第118行
at System.Web.WebPages.WebPageBase。 <> c__DisplayClassb.b__9(TextWriter的总重量)
在System.Web.WebPages.HelperResult.WriteTo(TextWriter的作家)
在System.Web.WebPages.WebPageBase.Write(HelperResult结果)
在ASP._Page__SiteLayout_cshtml.Execute(在e)中:\网络\ givetoru_SiteLayout.cshtml:线184
在System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
在System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable的1 executors)
at System.Web.WebPages.WebPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.WebPages.WebPageBase.<>c__DisplayClass7.<RenderPageCore>b__6(TextWriter writer)
at System.Web.WebPages.HelperResult.WriteTo(TextWriter writer)
at System.Web.WebPages.WebPageBase.Write(HelperResult result)
at System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action
1体)
在系统。 Web.WebPages.WebPageBase.PopContext()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWr iter writer,WebPageRenderingBase startPage)
at System.Web.WebPages.WebPageHttpHandler。ProcessRequestInternal(HttpContextBase HttpContext的)

ClientConnectionId:4f57f963-05e1-4429-946b-504e59e13050
错误编号:-2,状态:0,类别:11

在System.Web.WebPages.WebPageHttpHandler.HandleError(例外五)
在System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase HttpContext的)
在System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContext的上下文)
在System.Web.WebPages.WebPageHttpHandler.ProcessRequest(HttpContext的上下文)
在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔& completedSynchronously)

做一些挖掘后,它看起来像它可能与调用做WebMatrix.WebData.WebSecurity类像这样的:

WebSecurity.CurrentUserId 

有没有人有什么可能会导致此问题的任何想法?我是否需要对我的数据库做特别的事情来防止这些超时?

更新20170303 922AM CT

这里是我的连接字符串(敏感数据删节)以供参考:

<add name="StarterSiteEntities" connectionString="metadata=res://*/App_Code.ProductModel.csdl|res://*/App_Code.ProductModel.ssdl|res://*/App_Code.ProductModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tcp:*****;initial catalog=*****;integrated security=False;Connection Timeout=30;user id=*****;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

<add name="StarterSite" connectionString="Data Source=tcp:****;Initial Catalog=****;User ID=****;Password=*****;Integrated Security=False;Connection Timeout=30;" providerName= 
"System.Data.SqlClient" /> 

这里是我的_AppStart.cshtml文件初始化WebSecurity DB连接线:

WebSecurity.InitializeDatabaseConnection("StarterSite", "UserProfile", "UserId", "Email", autoCreateTables: false); 
+1

只是一个快速的想法:WebMatrix.WebData.WebSecurity处理SimpleMembershipProvider。默认情况下,这可以使用完全不同于常规数据访问代码的连接字符串。因此,您可以检查是否有两个不同的连接字符串正在使用,并且在迁移到完整的SQL Server数据库时可能没有更新。 –

+0

这看起来像是一般的超时问题。如果重新启动SQL Server,超时问题会消失吗? IE浏览器。问题是否仅在SQL Server运行一段时间后才会发生? – Dean

回答

1

它看起来像SQL Server的正常连接问题。由于您的应用程序一般工作,我假设您的问题可能是您可能会使用不同的连接字符串作为您的常规数据访问代码,并使用SimpleMembershipProvider进行身份验证,只有在从数据库中查询任何身份验证相关数据时才会导致此问题:

正如我在下面的注释中提到的那样,发生异常的问题WebMatrix.WebData.WebSecurity使用SimpleMembershipProvider来处理验证。用于此的连接字符串可能完全不同于用于常规数据访问代码的连接字符串,例如,一个实体框架DataContext

所以,你描述的方式,我认为这是非常有可能的是使用两个不同的连接字符串SimpleMembershipProvider和您的EF DataContext(或任何你使用你的数据访问需求),也许是一个为SimpleMembershipProvider在迁移到完整的SQL Server数据库时未更新。

我希望这至少能够让你朝着正确的方向前进。否则,也许你想分享你的web.config,特别是完整的Membership和ConnectionString配置。确保不要发布任何敏感数据,虽然:)

更新:

您发布的连接字符串看起来罚款和相同的。我在你的例外中错过了一点:它说Timeout expired,而如果它真的是连接超时,它会说Connection timeout expired(至少在.NET Framework 4.5或更新版本中,IIRC)。

所以你应该检查你是否会遇到查询性能问题。你在自定义用户表中有UserName的索引,因为这是根据StackTrace查询的内容吗?尽管我承认,似乎不太可能,没有任何复杂联接的用户表中的单个查询可能会运行超过30秒,即使没有索引。但是可能有时会遇到数据库锁。

因此,接下来要做的是将SQL Server Profiler附加到您的数据库,并让它运行,直到上面的异常出现在您的应用程序中。然后检查Profiler中此时是否执行了长时间运行的查询。

+0

谢谢你的深思。我已更新我的问题以包含连接字符串。 –

+0

@TodBirdsall我刚刚注意到我在你的异常中错过了一个重要的一点:它说'Timeout expired'与它应该说'Connection timeout expired',如果它是连接超时。虽然我现在不记得哪个框架版本在错误消息中添加了这个区别。你至少在.NET 4.5上?如果是这样,我相信它会说连接超时,如果它是一个。所以这可能是你面临的问题可能是执行速度慢的查询。我更新了答案。 –

+0

感谢您的更新。如果问题仍然存在,我会试一试。 –