代码之家  ›  专栏  ›  技术社区  ›  James Sumners Gavriel

请求完成后要自动运行的代码?

  •  0
  • James Sumners Gavriel  · 技术社区  · 14 年前

    我有自己的基于SQL的会话类。我想在程序执行结束时(即服务页面请求结束时)自动提交会话中的数据。对象析构函数(终结器)没有在每个请求结束时执行吗?有没有这样做而不必显式调用 Dispose() 方法每次处理完会话对象时?

    4 回复  |  直到 14 年前
        1
  •  0
  •   Russell McClure    14 年前

    在C中,终结器是非确定性的,这意味着您没有任何保证何时执行它。所以,不,你不能在你的场景中使用它们。

    我看到了两种方法来解决这个问题:

    1. 以编程方式在页面末尾的某个点调用Dispose life cycle (或通过michael g提到的global.asax)。
    2. 让基于SQL的会话类连接到一个页面事件(例如 卸货 事件)采取任何行动来清理自己。

    更新:

    对于你关于建议2的问题,我将作一点阐述。此选项将以某种方式允许基于SQL的会话类获得对网页实例的引用。一个选项(我将在下面展示)是使用基于SQL的会话类的构造函数来获取对网页的引用。然后,基于SQL的会话类可以注册它想要的任何事件,以了解页面发生了什么。

    namespace SomeNamespace
    {
       using System.Web.UI;
    
       public class SqlBasedSession
       {
          public SqlBasedSession(Page webPage)
          {
             webPage.Unload += new EventHandler(webPage_Unload);
          }
    
          void webPage_Unload(object sender, EventArgs e)
          {
             // the web page is being unloaded so this class can
             // cleanup it's resources now
          }
       }
    }
    

    如果还不清楚,请告诉我。

        2
  •  1
  •   Michael Gattuso    14 年前

    一种可能是使用global.asax。请求结束时有一个处理程序,在c global.asax.cs中的调用将查找以下内容:

    protected void Application_EndRequest(object sender, EventArgs e){
        //perform action - you have access to the HttpContext
    }
    

    但是,您必须注意处理程序中正在发生的事情——根据您的配置,您的资产(样式表、图像等)可能也会碰到这个请求,因此您可能需要设计一种方法来确保只有您的页面才会对其采取操作。

        3
  •  0
  •   Mahesh Velaga    14 年前

    我建议和国际奥委会集装箱供应商一起购买这类货物。您可以将它们连接到请求的末尾,并执行一些代码,特别是对于一些事务性的东西。

    我一直在用 Autofac ,它有一个activated()方法,我在激活会话时使用它来钩住我的事务提交。

        4
  •  0
  •   Community Jaime Torres    7 年前

    如果使用显式Dispose()路由,则自定义SQL会话类将需要实现IDisposable。

    我也建议 Russell McClure's answer 关于事件。