System.Net.Http.HttpClient 및 System.Net.Http.HttpClientHandler.NET Framework 4.5의 는 IDisposable ( System.Net.Http.HttpMessageInvoker 를 통해 )을 구현 합니다.
그만큼 using
문 문서는 말합니다 :
일반적으로 IDisposable 객체를 사용할 때는 using 문에서 선언하고 인스턴스화해야합니다.
이 답변 은 다음 패턴을 사용합니다.
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
그러나 Microsoft에서 가장 눈에 띄는 예제는 Dispose()
명시 적 또는 암시 적으로 호출되지 않습니다 . 예를 들어 :
- 원래 블로그 기사 HttpClient를의 relase를 발표했다.
- HttpClient에 대한 실제 MSDN 설명서
- BingTranslateSample
- GoogleMapsSample
- 월드 뱅크 샘플
에서 발표 의 의견을이야, 누군가가 마이크로 소프트 직원에게 물었다 :
샘플을 확인한 후 HttpClient 인스턴스에서 처리 작업을 수행하지 않은 것으로 나타났습니다. 내 응용 프로그램에서 문을 사용하여 HttpClient의 모든 인스턴스를 사용했으며 HttpClient가 IDisposable 인터페이스를 구현하기 때문에 올바른 방법이라고 생각했습니다. 내가 올바른 길을 가고 있습니까?
그의 대답은 다음과 같습니다.
.Net 4에서 실제로 혼합되지 않으므로 "using"및 비동기에주의해야하지만 일반적으로 옳습니다. .Net 4.5에서는 "using"문에서 "await"를 사용할 수 있습니다.
Btw, 당신은 여러 번 같은 HttpClient를 재사용 할 수 있습니다. 일반적으로 당신은 그것들을 항상 생성 / 폐기하지 않을 것입니다.
두 번째 단락은 HttpClient 인스턴스를 몇 번 사용할 수 있는지에 대해 걱정하지 않고 더 이상 필요하지 않은 후에 폐기해야하는 경우에 관한 질문입니다.
(업데이트 : 사실 @DPeden이 제공 한 두 번째 단락이 답의 열쇠입니다.)
그래서 내 질문은 :
현재 구현 (.NET Framework 4.5)에서 HttpClient 및 HttpClientHandler 인스턴스에서 Dispose ()를 호출해야합니까? 설명 : "필수"란 리소스 누수 또는 데이터 손상 위험과 같이 폐기하지 않은 부정적인 결과가있는 경우를 의미합니다.
필요하지 않은 경우 IDisposable을 구현하기 때문에 어쨌든 "좋은 습관"이 될 것입니까?
필요하거나 권장되는 경우 위에서 언급 한이 코드 가 안전하게 구현됩니다 (.NET Framework 4.5의 경우)?
이러한 클래스가 Dispose ()를 호출 할 필요가없는 경우 왜 IDisposable로 구현 되었습니까?
필요한 경우 또는 권장되는 경우 Microsoft 예제가 오도되거나 안전하지 않습니까?
Flush
매번 글을 쓸 때마다 하나씩 전화 를 걸 수 있으며 , 그것이 필요한 것보다 오랫동안 기본 자원을 계속 보유하는 불편 함 외에 "올바른 행동"에 필요하지 않은 것은 무엇입니까?