Как удалить ссылки на HttpWebRequests при совершении звонков на веб-сервис, которые не возвращают никакого ответа? - PullRequest
1 голос
/ 05 августа 2010

При выполнении вызовов на веб-сервис из веб-приложения asp.net, чтобы избежать создания нового прокси-сервера для каждого вызова веб-сервиса, я сохраняю прокси в диктонарном.Поэтому, когда выполняется вызов веб-службы, экземпляр прокси-сервера веб-службы возвращается на основе ключа, переданного фабричному методу.Если прокси для соответствующего ключа уже создан, этот прокси возвращается.В противном случае он создает прокси для ключа и возвращает прокси.

Все это работает нормально, если только реальный веб-сервис по какой-то причине не работает и не возвращает никакого ответа.Если это происходит, что в моем случае происходит довольно часто, создается System.Net.HttpWebRequest, который никогда не собирается GC.Причина в том, что HttpWebRequest является локальной переменной в HttpWebRequest.GetResponse (), которая все еще выполняется (так как она ожидает ответа, который никогда не придет).Следовательно, существует ссылка на HttpWebRequest, которая будет поддерживать объект в рабочем состоянии.

Один из способов обойти это состоит в том, чтобы поместить вызов веб-службы в блок Using, тем самым избавившись от объекта после вызова.сделал.Таким образом, ссылки на HttpWebRequest будут обрезаны, чтобы Gtt мог собирать HttpWebRequest.Тем не менее, при утилизации прокси, вся идея хранения прокси в диктонарии, чтобы избежать создания прокси для каждого сбоя вызова.

Следовательно, мой вопрос, есть ли у кого-нибудь какие-либо идеи, как я мог бы решить,проблема, связанная со ссылками на запросы HttpWebRequest, когда нет ответа от веб-службы?

Спасибо заранее!

Какой-то псевдо-код, объясняющий концепцию хранения прокси в диктонарном:

public Proxy GetProxy(String key) {
            if(!proxies.ContainsKey(key)) {
                proxies[key] = new Proxy();
            }
            return proxies[key];
        }

public Object GetObject(String key) {
            Object object =
            this.GetProxy(key).GetObject();
            return object;
        }

1 Ответ

1 голос
/ 05 августа 2010

Если целевой сайт не работает, вы, скорее всего, получите HttpException. Можете ли вы использовать этот механизм для управления временем жизни ваших экземпляров?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...