У меня есть рабочая роль Azure, которая, помимо прочих функций, выполняет некоторые HTTP-запросы каждые 80 секунд или около того. Это происходит постоянно. По мере того, как мы увеличиваем масштаб, он может делать намного больше HTTP-запросов, поэтому я написал код для использования BeginGetResponse, EndGetResponse и обратного вызова. Проблема в том, что ... у нас где-то утечка памяти. Когда этот процесс выполняется, он медленно, но верно теряет память, пока не закончится полностью. Иногда GC запускает и освобождает некоторые неиспользуемые объекты, но продолжает свой медленный нисходящий тренд.
Когда наш обратный вызов выполняется и мы завершаем запрос с помощью EndGetResponse (), мы не касаемся потока ответов. Все, что нам нужно знать, - это код состояния HTTP, который мы сохраняем для наших собственных записей. , Мы никогда не вызываем GetResponseStream () и впоследствии закрываем его. Мы делаем Закрываем () HttpWebResponse.
Мой вопрос: нужно ли что-то делать с потоком ответов, а затем закрыть () это? Не приведет ли это к утечке памяти? Все примеры MS / другие обсуждения SO, которые я видел, как-то связаны с потоком. Мне интересно, если мы должны добавить GetResponseStream (). Close () ...
Вот код:
// the request state class, passed along with async request
public class RequestState
{
public HttpWebRequest Request { get; set; }
public HttpWebResponse Response { get; set; }
// some other properties to track which request this is..
}
...... in some other class .....
// code to perform the request
public void DoHttpRequest()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://myurl.....");
RequestState state = new RequestState(req); // this just sets the Request property on RequestState
req.BeginGetResponse(OnRequestComplete, state);
}
// the callback, request has finished
public void OnRequestComplete(IAsyncResult result)
{
RequestState state = (RequestState)result.AsyncState;
HttpWebRequest req = state.Request;
state.Response = (HttpWebResponse)req.EndGetResponse(result);
// we do not care about the body of the response
// all we want is the status code, which we store somewhere else..
if (state.Response.StatusCode == HttpStatusCode.OK || state.Response.StatusCode == HttpStatusCode.Created)
{
// comm was successful
// save this result code somewhere...
}
else if (state.Response.StatusCode == HttpStatusCode.RequestTimeout || state.Response.StatusCode == HttpStatusCode.GatewayTimeout)
{
// comm timed out
// save this result code somewhere..
}
else
{
// something else, comm failed
// save this result code somewhere..
}
// we've got the relevant data from the HttpWebResponse object, dispose of it
state.Response.Close();
}
Спасибо!