Утилизация декларативных данных для каждого запроса без использования HttpModule - PullRequest
2 голосов
/ 11 июня 2009

У меня есть объект context, который связывает себя с HttpContext.Items через статическое свойство Current. Этот объект может использоваться напрямую через построители выражений и элементы управления, все они являются частью одной и той же библиотеки.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу избавиться от его управляемых ресурсов (клиентов WCF), когда запрос заканчивается без использования HttpModule (поскольку в противном случае он не нужен). Я реализовал полностью одноразовый шаблон (с Finaliser), но вы не можете полагаться на своевременное завершение экземпляров GC.

Я пытался подписать статический метод на HttpApplication.EndRequest (также PostRequestHandlerExecute) в конструкторе объектов (с блокировкой, чтобы гарантировать, что это происходит только один раз), но событие никогда не отправляется. Вероятно, это связано с тем, что изменяется экземпляр HttpApplication, хотя я не совсем уверен.

Есть какие-нибудь мысли о том, как лучше решить эту проблему?

1 Ответ

1 голос
/ 29 августа 2011

Подписка запросов на статическое событие приведет к утечке памяти. Он предотвращает сбор запроса на сбор данных, поскольку содержит ссылку на HttpApplication.

Если вы хотите вызвать dispose для элемента, кэшированного в HttpContext.Items, вам нужно сделать это в конце запроса. Если вы не хотите использовать HttpModule, используйте Global.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();
    }
}
...