При выполнении вызовов на веб-сервис из веб-приложения 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;
}