3

我有一个 ASP.NET 网站。如果我请求一个页面,它在大多数情况下都能正常工作,但有时我会收到一个 HttpUnhandledException。

我试图记录错误,但从错误消息中我无法解决问题。

堆栈跟踪:

at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.default_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\4e215a3c\72ef69da\App_Web_ylvnbciw.6.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

数据:

System.Collections.ListDictionaryInternal

基本异常:

System.InvalidOperationException: The connection was not closed. The connection's current state is open.
   at DbCategory.getParentCategories()
   at _Default.Page_Load(Object sender, EventArgs e)
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

目标站点:

Boolean HandleError(System.Exception)

我知道这与我的会话 og 获取变量有关,但我不确定。有人知道它可能是什么吗?

4

3 回答 3

1

一个好的和常见的做法是在使用块中使用 Db 对象(DbConnection、DbCommand、读取器、适配器等)。

这将防止 99% 的此类事情发生,确保在您使用完对象后始终将其丢弃。

于 2010-04-20T17:33:56.550 回答
1

此类错误不是因为错误处理 - 连接未关闭。

这样的错误可能是您在保持打开连接的静态类或方法中使用 SqlConnection ,然后 - 在非静态中,此时可能会发生异常。


更新:嗯,这种方法不是很节省 - 它完全符合我所说的 - 他创建了连接,但从不释放它。SqlConnection 是一个非常重的对象,你应该在获取或设置数据后立即处理它。

您应该重写您的逻辑 - 每页或每个操作创建一个连接,并且您永远不应该将连接存储在您的类中。

如果这对您来说不可能,请使用 lock 语句确保单例,如下所示:

private static object singleton;

lock (singleton)
{
    // Some manipulations with your server
}
于 2010-04-20T17:50:09.573 回答
0

VMAtm:也许你在那里得到了一些东西,因为在网站获得越来越多的用户之后,异常显示得更多。我有一个静态类来使用单例方法来保持数据库连接......

public static SqlConnection getDbConnection() 
{ 
    if (sqlConn == null) 
    { 
        source = "data source=..."; 
        sqlConn = new SqlConnection(source); 
    }
    return sqlConn; 
}

这种方法可以完全保存吗?

使用静态方法在抽象类中调用所有数据库调用,这些抽象类从单例方法获取数据库连接

于 2010-04-20T18:52:03.433 回答