【发布时间】:2012-07-03 07:20:38
【问题描述】:
我有一个 ASP.NET 网页,它连接到多个数据库并使用多个文件。我不清楚如果最终用户在完成加载之前关闭网页会发生什么,即 ASP.NET 生命周期结束还是服务器仍会尝试生成页面并将其返回给客户端?我对生命周期有合理的了解,但找不到任何相关文档。
我正在尝试查找潜在的内存泄漏。我正在尝试确定是否所有代码都会运行,即是否会释放连接等。
【问题讨论】:
标签: asp.net
我有一个 ASP.NET 网页,它连接到多个数据库并使用多个文件。我不清楚如果最终用户在完成加载之前关闭网页会发生什么,即 ASP.NET 生命周期结束还是服务器仍会尝试生成页面并将其返回给客户端?我对生命周期有合理的了解,但找不到任何相关文档。
我正在尝试查找潜在的内存泄漏。我正在尝试确定是否所有代码都会运行,即是否会释放连接等。
【问题讨论】:
标签: asp.net
代码仍会运行。 HttpRequest 对象上有一个属性IsClientConnected,可以指示如果您在循环中执行流式输出等操作,客户端是否仍处于连接状态。
【讨论】:
一旦对页面的请求产生,就会进入生命周期的卸载。在发送卸载信息之前,它不知道客户端不存在。
其中一个独特的方面是动态编译部分。你可以在这里阅读:http://msdn.microsoft.com/en-us/library/ms366723
有关 ASP.NET 生命周期的更多信息,请查看此处: http://msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stages
所以基本上,请求一个页面,ASP.NET 使用动态编译基本上创建页面,然后尝试将页面发送到客户端。所有代码都将按照您在代码中指定的方式运行,无论客户端是否存在。
这是一个非常简单的答案,但这是基础知识。您的代码已编译,请求生成响应,然后发送响应。除非您明确告诉它,否则它不会分段发送。
编辑:感谢 Chris Lively 提出的更改措辞的建议。
【讨论】:
您提到跟踪潜在的内存泄漏和“连接”一词。我猜你的意思是数据库连接。
您应该始终将所有连接和命令包装在using 子句中。这将保证连接/命令被正确处理,无论是否发生错误、客户端断开连接等。
这里有很多例子,但归根结底是这样的:
using (SqlConnection conn = new SqlConnection(connStr)) {
using (SqlCommand cmd = new SqlCommand(conn)) {
// do something here.
}
}
如果由于某种原因,您的代码不允许您这样做,那么我建议您接下来要做的就是重组它,因为您做错了。一个常见的问题是,有些人会在页面执行的顶部创建一个连接对象,然后在页面的整个生命周期中重新使用它。这保证会导致问题,包括但不限于:连接池错误、内存丢失、随机查询问题、应用程序完全挂起……
不必担心在代码中需要它们时建立(和丢弃)连接的性能。 Windows 使用闪电般快速的连接池,即使您的应用发出已完成的信号,也会根据需要保持连接。
另请注意:每次使用非托管类时都应使用此模式。那些总是执行IDisposable。
【讨论】: