В настоящее время я работаю над службой мониторинга работоспособности, которая будет звонить на каждый веб-сайт, размещенный на текущей машине. То, что он делает, является базовым для того, что он проходит через все размещенные веб-сайты, делает вызов машины через HttpClient для каждого из них и сохраняет их текущий статус в базе данных. Проблема в том, что эта служба при запуске создает несколько рабочих процессов IIS, которые просто не исчезают, а использование памяти увеличивается на 1% каждые несколько минут. Я почти уверен, что это не совпадение, я искал много разных тем, касающихся этой проблемы, но не смог найти результат, который бы мне подошел. Любые идеи о том, как решить эту проблему? Вот фрагмент кода, который я использую:
public void PingWebsites(List<Website> websites)
{
using (var client = new HttpClient())
{
for (int i = 0; i < websites.Count(); i++)
{
{
if (!websites[i].Environment.Contains("CI"))
{
Task<HttpResponseMessage> response = null;
try
{
response = client.GetAsync(websites[i].Address);
if (!response.Result.IsSuccessStatusCode)
{
SaveStatus(websites[i].ID, 0);
}
else
{
SaveStatus(websites[i].ID, 1);
}
}
catch (Exception e)
{
SaveStatus(websites[i].ID, 0);
}
finally {
if (response != null)
{
response.Dispose();
}
}
}
}
}
}
}
Я также искал возможность ошибки таймера и вызова sql, но я считаю, что это больше проблема с HttpClient.
Обновлено: я также пытался использовать уникальный экземпляр HttpClient, но потребление памяти было таким же, и со временем потреблялось все больше и больше, так что это не моя текущая проблема.
Правильное использование HttpClient
подразумевает совместное использование одного экземпляра, а не его повторное создание каждый раз, когда вы читаете об этом здесь. Что касается нескольких рабочих процессов IIS, я предполагаю, что они связаны с сайтами, которые вы запрашиваете, если они раньше простаивали.
@Daniel Я пробовал этот метод раньше, но он все еще вызывал утечку памяти, я не почувствовал никакой разницы, поэтому в конце концов вернулся к исходному коду. Проблема по-прежнему сохраняется с увеличением использования на 1% в минуту, а рабочие процессы IIS не исчезают, поэтому мне остается предположить, что есть еще одна проблема.
Я понял, что вызывало проблему, запросы перегружали машину сотнями запросов и из-за нехватки памяти, она сошла с ума. После увеличения его емкости у него больше нет этой проблемы.
не запускайте httpclient при использовании блока. см. aspnetmonsters.com/2016/08/2016-08-27-httpclientнеправильно