【问题标题】:Does asp.net lifecycle continue if I close the browser in the middle of processing?如果我在处理过程中关闭浏览器,asp.net 生命周期会继续吗?
【发布时间】:2012-07-03 07:20:38
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一旦对页面的请求产生,就会进入生命周期的卸载。在发送卸载信息之前,它不知道客户端不存在。

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

      【讨论】:

      • 谢谢。您的意思是:“除非您明确告诉它,否则它不会分段发送”。我在页面上使用 Response.Flush。如果这有任何影响,我正在徘徊?
      • 是的。克里斯链接到的那个问题有更多细节。我没有处理太多使用 Flush 的问题,但它确实会中断流程并在该位置发送出去。我过去曾用它来发送生成的“文件”。但据我所知,它一开始就打破了 ASP.NET 页面生命周期。 msdn.microsoft.com/en-us/library/… 了解更多详情。
      【解决方案3】:

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

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

      这里有很多例子,但归根结底是这样的:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多