2017-03-03 100 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

感謝您的更新。如果問題仍然存在,我會試一試。 –