제시된 코드에서 Keep-Alive가 제대로 동작하지 않는 이유는
HttpWebRequest 객체를 같은 인스턴스로 여러 번 재사용하고 있기 때문입니다.
HttpWebRequest는 요청 1회당 1개 인스턴스를 사용하는 구조이며,
한 번 GetResponse()가 호출된 이후에는 같은 객체로 다시 요청을 보내는 것이 올바르지 않습니다.
Keep-Alive는 요청 객체 재사용이 아니라, 내부 TCP 연결 재사용을 의미합니다.
또한 아래 설정도 문제가 있습니다.
ProtocolVersion = HttpVersion.Version10
→ HTTP/1.0에서는 기본적으로 Keep-Alive가 지원되지 않습니다.
→ HTTP/1.1을 사용해야 Keep-Alive가 정상 동작합니다.
올바른 사용 방법 요약
- 요청마다 새로운 HttpWebRequest 객체 생성
ProtocolVersion은 HTTP/1.1
KeepAlive = true만 설정 (Connection 헤더 직접 지정 불필요)
- 응답 스트림과 Response는 반드시 Close()
핵심 예시
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ProtocolVersion = HttpVersion.Version11;
request.KeepAlive = true;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
}
이렇게 하면 .NET이 내부적으로 TCP 연결을 재사용하여
Keep-Alive의 이점을 자동으로 처리합니다.
정리하면,
HttpWebRequest 객체를 재사용하면 안 되고
HTTP/1.1 + KeepAlive=true 조합이 올바른 방식입니다.