我有一个 ASP.NET 网页,它连接到许多数据库并使用许多文件。我不清楚如果最终用户在完成加载之前关闭网页会发生什么,即 ASP.NET 生命周期结束还是服务器仍会尝试生成页面并将其返回给客户端?我对生命周期有合理的了解,但我找不到任何关于此的文档。
我正在尝试查找潜在的内存泄漏。我正在尝试确定是否所有代码都将运行,即是否将处理连接等。
我有一个 ASP.NET 网页,它连接到许多数据库并使用许多文件。我不清楚如果最终用户在完成加载之前关闭网页会发生什么,即 ASP.NET 生命周期结束还是服务器仍会尝试生成页面并将其返回给客户端?我对生命周期有合理的了解,但我找不到任何关于此的文档。
我正在尝试查找潜在的内存泄漏。我正在尝试确定是否所有代码都将运行,即是否将处理连接等。
代码仍然会运行。IsClientConnected
如果您在循环中执行流式输出等操作,对象上有一个属性HttpRequest
可以指示客户端是否仍处于连接状态。
一旦生成了对页面的请求,它将进入生命周期的卸载。它不知道客户端不在那里,直到它发送有关卸载的信息。
一个独特的方面是动态编译部分。你可以在这里阅读: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
。