HttpWebRequest 로 FileUpload 시 주의
(대용량 파일 Upload 하기)


Intro

 간혹 어떤 이유가 되었든 파일을 업로드 할 때, WebClient 가 아닌 HttpWebRequest 객체를 이용해야 할 경우가 있습니다. 이 경우 다른건 다 좋은데, 용량이 큰 파일을 업로드하고 있다보면, 계속해서 메모리가 올라가는 것을 볼 수 있습니다. 때론 OutOfMemory Exception 까지 발생할 때가 있지요.


Content

원인은 HttpWebRequest 의 프로퍼티 속에 있습니다.
http://207.46.16.248/ko-kr/library/system.net.httpwebrequest_properties.aspx

보이시나요?

바로 AllowWriteStreamBuffering 라는 프로퍼티 입니다.
기본값은 true 로 되어 있는데, 이 경우 보낸 데이터를 버퍼링 하게 됩니다.
true 로 설정되어 있으면, 데이터 버퍼에서 사용 가능한 메모리를 모조리 사용해 버려, 큰 데이터를 전송할 때 문제가 발생할 수 있습니다.

그렇다면 장점은 무엇일까요?
MSDN 에 따르면, 리디렉션이나 인증요청을 다시 보낼 수 있다고 합니다.

저 같은 경우 위와 같은 경우가 잘 없기 때문에 - 더욱이 대용량 전송을 하는 경우가 더 많기에 - false 로 설정을 해 주어야 합니다.



System.Net.HttpWebRequest webRequest =
 System.Net.HttpWebRequest.Create(task.DestURI) as System.Net.HttpWebRequest;
webRequest.Method = "POST";
webRequest.Accept = "*/*";
webRequest.UserAgent = "DLNADOC/1.50";
webRequest.Timeout = System.Threading.Timeout.Infinite;
webRequest.KeepAlive = true;
webRequest.SendChunked = true;
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.AllowWriteStreamBuffering = false;


대략 이런 형태가 되겠네요.



Result

 아직도 .NET 은 모르는게 너무 많은 것 같습니다.
더욱이 이런 경우는 기본값이 true 이기 때문에, 자세히 알지 못하면 false 로 설정하지 않을 것 같네요.
"항상 버그는 문제가 생긴 뒤 고쳐지는 법" 이라는 말로 위안을 삼으며, 블로깅 마치도록 하겠습니다. :)