예상 대기 (Expect: 100-continue)는 클라이언트가 서버에게 전송할 준비가 되었는지 확인하기 위해 사용되는 HTTP/1.1 기능입니다.
클라이언트가 POST 요청을 보낼 때, HTTPWebRequest는 기본적으로 Expect: 100-continue 헤더를 요청 메시지에 자동으로 추가합니다.
그리고 이 헤더는 서버에서 100 (Continue) 응답을 받기 전에는 클라이언트가 본문 데이터를 보내지 않도록 합니다. 이 기능은 클라이언트와 서버 사이의 데이터 전송을 효율적으로 처리하기 위한 것입니다.
그러나 이 기능은 일부 서버와의 통신에서 문제를 일으킬 수 있습니다. 예를 들어, 서버에서 Expect: 100-continue 요청에 대한 적절한 응답을 반환하지 않는 경우, 클라이언트는 계속해서 대기 상태에 머물게 되어 시간 초과 오류를 발생시킬 수 있습니다. 이러한 경우, 클라이언트는 Expect: 100-continue 요청을 수행하지 않도록 설정할 수 있습니다.
위 헤더는 클라이언트가 헤더를 먼저 보내서 서버의 allow 여부에 따라 request body를 넘길지 판단한다.
문제는 HTTP/1.1을 지원하지 않는 웹 서버 혹은 애플리케이션에 이 헤더를 사용할 때 발생한다.
.NET 4에서는 HttpWebRequests 사용시, ServicePoint.Expect100Continue 속성을 사용하여 Expect 헤더(게시물 요청 시)를 비활성화할 수 있다.
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.ServicePoint.Expect100Continue = false;
request.Method = "POST";
// Add your other request parameters and data here
위의 예제에서는 HttpWebRequest의 ServicePoint.Expect100Continue 속성을 false로 설정함으로써 Expect: 100-continue 요청을 비활성화합니다.
HttpClient 활용
HttpClient는 HTTP/1.1 이상에서 Expect: 100-continue 헤더를 자동으로 추가하지 않기 때문에, 만약 HttpClient를 사용하여 HTTP/1.0 서버에 POST 요청을 보내면 Expect: 100-continue 요청에 대한 응답이 없을 수 있습니다.
이 경우에는 HttpClient의 DefaultRequestHeaders 속성을 사용하여 Expect: 100-continue 헤더를 수동으로 추가할 수 있습니다. 이를 위해서는 다음과 같이 코드를 작성할 수 있습니다.
using (var client = new HttpClient())
{
var content = new StringContent("request body");
// Add the Expect: 100-continue header manually
client.DefaultRequestHeaders.ExpectContinue = false;
var response = await client.PostAsync("http://www.example.com", content);
var responseString = await response.Content.ReadAsStringAsync();
// Process the response here
}
위의 코드에서는 HttpClient의 DefaultRequestHeaders속성을 사용하여 Expect: 100-continue 헤더를 false로 설정하여 수동으로 추가하고 있습니다. 이렇게 설정하면 HttpClient는 Expect: 100-continue 요청을 보내지 않습니다.
하지만 HTTP/1.0 서버는 요청 본문을 전송하기 전에 응답을 보내는 것이 아니기 때문에, 이 경우에는 서버에서 지원하는 HTTP 버전에 맞는 요청 방식을 사용해야 합니다. 만약HTTP/1.0 서버에 대한 요청이 필요한 경우에는 HttpClient 대신 HttpWebRequest를 사용하여 요청을 보내는 것이 더 적합할 수 있습니다.