0 투표
//1st request
webrequest = (HttpWebRequest)HttpWebRequest.Create(sLink);
               
                webrequest.KeepAlive=true;
                //webrequest.Pipelined = true;
                webrequest.Timeout =3000;
                webrequest.Method = "POST";
                webrequest.UserAgent= "beone/v1.0";
                webrequest.Headers.Add("Beone-Encoding: " + gwid + "\n");
                   
                webrequest.ProtocolVersion = HttpVersion.Version10;   
                webrequest.Connection = "keepalive";
               
                           
                string sdata = "Testing";
                byte [] data = enc.GetBytes(sdata);
                Stream stream = webrequest.GetRequestStream();
                stream.Write(data,0,data.Length);
                stream.Close();
               
                HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
                StreamReader reader = new StreamReader(webresponse.GetResponseStream());
                char[] readbuffer = new char[256];
                int count = reader.Read(readbuffer,0,256);

                while(count>0)
                {
                    string outputdata = new string(readbuffer,0,count);
                    buffer = buffer + outputdata;
                    count = reader.Read(readbuffer,0,256);
                }
                MessageBox.Show(buffer);
//2nd request
  string sdata = "Testing";
                byte [] data = enc.GetBytes(sdata);
                Stream stream = webrequest.GetRequestStream();
                stream.Write(data,0,data.Length);
                stream.Close();
               
                HttpWebResponse response = (HttpWebResponse)webrequest.GetResponse();
                StreamReader reader1 = new StreamReader(webresponse.GetResponseStream());
                char[] readbuffer1 = new char[256];
                int count1 = reader.Read(readbuffer1,0,256);

                while(count1>0)
                {
                    string outputdata1 = new string(readbuffer1,0,count);
                    buffer = buffer + outputdata1;
                    count = reader.Read(readbuffer1,0,256);
                }

reader.Close();
                webresponse.Close();
                response.Close();

1 답변

0 투표

제시된 코드에서 Keep-Alive가 제대로 동작하지 않는 이유
HttpWebRequest 객체를 같은 인스턴스로 여러 번 재사용하고 있기 때문입니다.

HttpWebRequest요청 1회당 1개 인스턴스를 사용하는 구조이며,
한 번 GetResponse()가 호출된 이후에는 같은 객체로 다시 요청을 보내는 것이 올바르지 않습니다.
Keep-Alive는 요청 객체 재사용이 아니라, 내부 TCP 연결 재사용을 의미합니다.

또한 아래 설정도 문제가 있습니다.

  • ProtocolVersion = HttpVersion.Version10
    → HTTP/1.0에서는 기본적으로 Keep-Alive가 지원되지 않습니다.
    HTTP/1.1을 사용해야 Keep-Alive가 정상 동작합니다.

올바른 사용 방법 요약

  1. 요청마다 새로운 HttpWebRequest 객체 생성
  2. ProtocolVersionHTTP/1.1
  3. KeepAlive = true만 설정 (Connection 헤더 직접 지정 불필요)
  4. 응답 스트림과 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 조합이 올바른 방식입니다.

구로역 맛집 시흥동 맛집
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
...