我有一个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
BaseException:
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)
TargetSite:
Boolean HandleError(System.Exception)
我知道这是关于我的会话og获取变量的东西,但我不确定。有没有人知道它可能是什么?
答案 0 :(得分:1)
一个好的常见做法是在使用块中使用Db对象(DbConnection,DbCommand,reader,adapter等)。
这可以防止99%的此类事情发生,确保在您完成使用后始终处置对象。
答案 1 :(得分:1)
此类错误不是因为错误处理 - 连接未关闭。
这样的错误可以是你在静态类或方法中使用SqlConnection来保持开放连接,之后 - 在非静态中,在这一刻可能发生异常。
更新: 嗯,这个方法不是很节省 - 它完全是我所说的 - 他创建了连接,但从未发布它。 SqlConnection是一个非常重的对象,你应该在获取或设置数据后立即处理它。
你应该重写你的逻辑 - 每页或每个操作创建一个连接,你永远不应该在你的类中存储连接。
如果您无法做到这一点,请使用lock语句确保singleton,如下所示:
private static object singleton;
lock (singleton)
{
// Some manipulations with your server
}
答案 2 :(得分:0)
VMAtm:也许你在那里得到了一些东西,因为在网站获得越来越多的用户之后,例外显示了更多。我有一个静态类来使用单例方法来保存数据库连接...
public static SqlConnection getDbConnection()
{
if (sqlConn == null)
{
source = "data source=...";
sqlConn = new SqlConnection(source);
}
return sqlConn;
}
这种方法完全省钱吗?
使用静态方法在抽象类中调用所有数据库调用,这些抽象类从单例方法获取数据库连接