从SQL Server CE迁移到SQL Server,现在WebSecurity导致SQL超时

时间:2017-03-03 00:08:13

标签: c# asp.net sql-server sql-server-ce asp.net-webpages

我们有一个使用ASP.Net网页构建的网站

我最近将数据库从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):等待操作超时

     

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception,Boolean breakConnection,Action 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 completion,Int32 timeout,Task& task,Boolean asyncWrite)
  在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)
  在System.Data.SqlClient.SqlCommand.ExecuteScalar()
  at WebMatrix.Data.Database.QueryValue(String commandText,Object [] args)
  at WebMatrix.WebData.DatabaseWrapper.QueryValue(String commandText,Object [] parameters)
  at WebMatrix.WebData.SimpleMembershipProvider.GetUserId(IDatabase db,String userTableName,String userNameColumn,String userIdColumn,String userName)
  at WebMatrix.WebData.SimpleMembershipProvider.GetUser(String username,Boolean userIsOnline)
  在System.Web.Security.Membership.GetUser(String username,Boolean userIsOnline)
  at WebMatrix.WebData.WebSecurity.GetUserId(String userName)
  在WebMatrix.WebData.WebSecurity.get_CurrentUserId()
  at ASP._Page_Default_cshtml。<> c__DisplayClass5.b__3()在e:\ web \ givetoru \ Default.cshtml:第118行
  在System.Web.WebPages.WebPageBase。<> c__DisplayClassb.b__9(TextWriter tw)
  在System.Web.WebPages.HelperResult.WriteTo(TextWriter writer)
  在System.Web.WebPages.WebPageBase.Write(HelperResult result)
  at ASP._Page__SiteLayout_cshtml.Execute()在e:\ web \ 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 body)
  在System.Web.WebPages.WebPageBase.PopContext()
  在System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)
  在System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext)

     

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

     

at System.Web.WebPages.WebPageHttpHandler.HandleError(例外e)
  在System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext)
  在System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContext context)
  在System.Web.WebPages.WebPageHttpHandler.ProcessRequest(HttpContext context)
  在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
  在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; 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数据库连接的行:

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

1 个答案:

答案 0 :(得分:1)

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

正如我在下面的评论中所提到的,WebMatrix.WebData.WebSecurity,发生异常的地方,使用SimpleMembershipProvider处理身份验证。用于此的连接字符串可能与您用于常规数据访问代码的连接字符串完全不同,例如实体框架DataContext

因此,您描述它的方式,我认为您很可能使用两个不同的连接字符串SimpleMembershipProvider和您的EF DataContext(或者您用于数据访问需求的任何内容)并且在迁移到完整的SQL Server数据库时,SimpleMembershipProvider的版本可能没有更新。

我希望这至少会引导你朝着正确的方向前进。另外,也许您想要共享您的web.config,特别是完整的Membership和ConnectionString配置。但请确保不发布任何敏感数据:)

<强>更新

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

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

接下来你可以做的是将SQL Server Profiler附加到你的数据库并让它运行,直到你的应用程序中出现如上所述的异常。然后检查在Profiler中是否执行了任何长时间运行的查询。