HttpClient 에서 대용량 파일 업로드시 간혈적 오류

안녕하세요. C# 콘솔 환경에서 HttpClient 클래스를 이용해서 서버에 파일을 업로드 하는데 이게 간혈적으로 (10번 시도시 약 4번은 실패) 오류가 발생되는데 혹시 오류나는 원인과 해결방법을 알고 계시다면 답변을 듣고 싶어 질문드려 봅니다.

제목에는 대용량이라고 했지만 그렇게 큰 용량도 아닙니다.
624메가바이트의 .zip의 압축파일 입니다.

코드는 다음과 같이 작성하였습니다.

var handler = new HttpClientHandler();
handler.AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate;
handler.ServerCertificateCustomValidationCallback = (_, __, ___, ____) => true;
handler.MaxRequestContentBufferSize = 2147483647;

var client = new HttpClient(handler);
client.DefaultRequestHeaders.ConnectionClose = true;
client.Timeout = TimeSpan.FromMinutes(30);

var content = new MultipartFormDataContent("NKdKd9Yk");
var fileStream = File.OpenRead(zipFilePath);
var fileContent = new StreamContent(fileStream, 100000);

content.Add(fileContent, "File", zipFileName);
Console.WriteLine("Sending file request to server...");

var response = await client.PostAsync(uploadUrl, content);
var responseContent = await response.Content.ReadAsStringAsync();

,netframework 4.x 버전의 콘솔 환경 입니다.

오류 내용은 client.PostAsync() 메서드에서 오류가 발생하고 있습니다.

Error occurred: 이 요청을 보내는 동안 오류가 발생했습니다.
Stack trace:
위치: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
위치: System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()

서버는 .NET 8인데
MaxRequestBodySize = long.MaxValue;
MultipartBodyLengthLimit = long.MaxValue;
모두 설정은 해둔 상태 입니다. (설정이 잘못됬으면 100% 오류가 났겠죠?)

*아! 참고로 콘솔은 1회성으로 한번 실행되고 프로세스가 완전히 종료 됩니다.

1 Like

네트워크 이슈일 거 같다는 생각이 그냥 드네요. 스위치나 케이블 확인

1 Like

IDC 센터에 들어간 서버에서 실행되는 거라서.,
물리적인 문제는 아닐거 같은데., ㅠㅠ 답변 감사합니다.

2 Likes

위 문제에 대해 다음 글을 보고 적용해 보았습니다.
적용 후 일단 동일 문제가 계속 발생되고 있진 않는데 지켜봐야 할 것 같습니다.


7 Likes

포스팅 내용이 흥미로워서 읽어보니 HttpClient를 HttpWebRequest로 바꿔서 해결했다는 것 같네요. 만약 그렇다면 아마도 내부적으로 HttpWebRequest를 사용하는 것으로 알고 있는 WebClient의 Upload 메서드를 사용하는 편이 더 간단할 수도 있겠네요.

1 Like

사실
말씀 하신 WebClient 포함 HttpWebRequest과 포스팅 내용에 언급된 ServicePointManager 클래스는 전역에 영향이 되어 MS에서는 사용하지 않는걸 권장하고 있습니다.

System.Net.Http.HttpClient 클래스에는 HttpWebRequest 에서 지원된 세부적인 속성이 노출되어 있지 않아

직접 커스텀하게 헤더에 추가 해서 설정해야 하는 부분이 있어서 일단 문제의 원인이 해당 내용이 맞는지 빠른 파악을 위해 임시(?)로 저 포스팅 내용 처럼 적용해 보았습니다.

추후에 System.Net.Http.HttpClient 클래스 사용으로 정식으로 상황에 맞게 수정 처리가 필요할 것 같습니다.

1 Like