재우니의 블로그

 

예상 대기 (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을 지원하지 않는 웹 서버 혹은 애플리케이션에 이 헤더를 사용할 때 발생한다.

 

 

지원하지 않는 경우 적절한 응답을 주지 않기 때문에 문제가 된다.

 

 

발췌사이트

 

https://devday.tistory.com/entry/HTTP11-Expect-100-continue-%EC%9D%B4%EC%8A%88-%EC%B2%98%EB%A6%AC

 

HTTP/1.1 Expect: 100-continue 이슈 처리

HTTP 헤더에 다음과 같은 헤더가 포함되고 request body가 넘어오지 않는 경우가 있다. Expect: 100-continue 위 헤더는 클라이언트가 헤더를 먼저 보내서 서버의 allow 여부에 따라 request body를 넘길지 판단

devday.tistory.com

 

HttpWebRequests 활용

 

.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를 사용하여 요청을 보내는 것이 더 적합할 수 있습니다.

 

 

 

https://stackoverflow.com/a/14672534

 

How to disable the “Expect: 100 continue” header in WinRT's HttpWebRequest

I'm developing an app that for legacy code reasons I can't upgrade for the new HttpClient so I'm using HttpWebRequests. In .NET 4 we could deactivate the Expect header (on posts requests) using

stackoverflow.com

 

web.config 활용하기

 

.NET 4에서는 HttpWebRequests 사용시, 전역으로 web.config 에서 설정 가능하다.

 

<system.net>
  <settings> 
    <servicePointManager expect100Continue="false"/>  
  </settings> 
</system.net>