9

我有一个 ASP.NET 网页,它连接到许多数据库并使用许多文件。我不清楚如果最终用户在完成加载之前关闭网页会发生什么,即 ASP.NET 生命周期结束还是服务器仍会尝试生成页面并将其返回给客户端?我对生命周期有合理的了解,但我找不到任何关于此的文档。

我正在尝试查找潜在的内存泄漏。我正在尝试确定是否所有代码都将运行,即是否将处理连接等。

4

3 回答 3

8

代码仍然会运行。IsClientConnected如果您在循环中执行流式输出等操作,对象上有一个属性HttpRequest可以指示客户端是否仍处于连接状态。

于 2012-07-02T21:09:10.750 回答
4

一旦生成了对页面的请求,它将进入生命周期的卸载。它不知道客户端不在那里,直到它发送有关卸载的信息。

一个独特的方面是动态编译部分。你可以在这里阅读: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 对更改措辞的建议。

于 2012-07-02T21:11:28.860 回答
2

您提到跟踪潜在的内存泄漏和“连接”一词。我猜你的意思是数据库连接。

您应该始终将所有连接和命令包装在using子句中。这将保证连接/命令被正确处理,无论是否发生错误、客户端断开连接等。

这里有很多例子,但归结为:

using (SqlConnection conn = new SqlConnection(connStr)) {
  using (SqlCommand cmd = new SqlCommand(conn)) {
     // do something here.
  }
}

如果由于某种原因,您的代码不允许您这样做,那么我建议您接下来要做的就是重组它,因为您做错了。一个常见的问题是,有些人会在页面执行的顶部创建一个连接对象,然后在页面的整个生命周期中重新使用它。这保证会导致问题,包括但不限于:连接池错误、内存丢失、随机查询问题、应用程序的完全冲洗……

不要担心在代码中需要它们时建立(和丢弃)连接的性能。Windows 使用闪电般快速的连接池,即使您的应用程序发出已完成的信号,也会根据需要保持连接。

另请注意:每次使用非托管类时都应使用此模式。那些总是执行IDisposable

于 2012-07-02T21:40:01.220 回答