代码之家  ›  专栏  ›  技术社区  ›  Richard Szalay

在不使用HttpModule的情况下处理每个请求的声明性数据

  •  2
  • Richard Szalay  · 技术社区  · 17 年前

    我有一个“context”对象,它与HttpContext.Items通过静态电流特性。这个对象可以通过表达式生成器和控件直接使用,它们都是同一个库的一部分。

    full disposable pattern (使用finalizer),但不能及时依赖GC定案实例。

    我试图订阅一个静态方法HttpApplication.EndRequest(也可以是PostRequestHandlerExecute)在objects构造函数中(通过锁定来确保它只发生一次),但从不调度事件。这大概是因为HttpApplication的实例发生了变化,尽管我不完全确定。

    有什么解决这个问题的最佳方法吗?

    1 回复  |  直到 17 年前
        1
  •  1
  •   TheCodeKing    15 年前

    向静态事件订阅请求将导致内存泄漏。它阻止请求开始garage collected,因为它包含对HttpApplication的引用。

    HttpContext.Items 你需要在请求结束时这样做。如果不想使用HttpModule,请使用全局.ascx然后钩住 EndRequest

    void Global_EndRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        var disposableItem = app.Context.Items["disposableItem"] as IDisposable;
        if (disposableItem != null)
        {
            disposableItem.Dispose();
        }
    }
    
    推荐文章