업체 사이트 유지보수 중 사용이 오래된 DEXTUpload.NET 업로드 모듈을 사용하고 있었습니다.
(근래에도 이런 유료 업로드 모듈을 사용하는지는 잘 모르겠는데 예전 asp 시절에 많이 사용되다 보니 이후 닷넷 버전으로도 컨버팅이 되어 이용을 하는 듯합니다.)
해당 업로드 부분에서는 업로드 상태(진행 현황)를 모니터링하는 기능이 자체 내장되어 있어 샘플대로 사용을 하고 있었습니다.
문제
1. 파일의 업로드가 완료되어도 monitor.aspx 가 열려 있으면 계속해서 1초 간격으로 페이지 refresh 가 일어납니다.(비정상적으로 페이지가 닫히지 않거나 URL을 직접 호출한 경우)
2. monitor.aspx 페이지의 html 과 관계없이 자체적으로 상태 표시를 html 로 노출합니다.
1번 문제로 인해 페이지 호출이 계속해서 일어나는 현상이 발생하기 때문에 불필요한 connection이 증가하게 됩니다.
현재 구현된 소스
monitor.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Refresh" content="1"/>
<meta http-equiv="content-Type" content="text/html; charset=utf-8" />
<link rel="Stylesheet" type="text/css" href="/Common/Css/CustomProgress.css"/>
</head>
<%
if(isUploadClosed )
{
%>
<body onload='top.window.close();'></body>
%>
</html>
monitor.aspx.cs
protected void Page_Load(object sender, System.EventArgs e)
{
try
{
using (DEXTUpload.NET.FileUploadMonitor monitor = new DEXTUpload.NET.FileUploadMonitor())
{
monitor.ShowMonitor();
}
}
catch (Exception ex)
{
Log.LogWrite(ex.ToString());
}
}
* 업로드 파일에서 업로드를 진행하면 해당 monitor.aspx 를 호출하여 업로드 상태를 모니터링(진행상황)을 하도록 하고 이후 완료 후 페이지가 닫히도록 합니다.
ShowMonitor() 가 호출되면 aspx 페이지와 무관하게 refresh 가 되며 업로드 중이면 다시 ShowMonitor() 가 호출하며 이런 과정이 완료될 때까지 반복됩니다. 하지만 위의 문제 해결이 필요하여 DEXTUpload.NET.DLL 의 FilUploadMonitor 에 대한 기능을 확인할 수 없어 실제 해당 코드의 구조를 리버스 엔지니어링을 통해 들여다보게 되었습니다.
대략적인 코드를 확인해보니 ShowMonitor() 에서 바로 html 코드를 생성해서 Flush 를 해주게 됩니다. 또한 <head> 태그에 refresh meta 태그가 추가되어 1초마다 자동으로 페이지를 다시 호출하도록 처리가 되어 있기 페이지가 무한 호출되는 상태에 빠질 수도 있습니다.
ShowMonitor()의 무한 호출을 막기 위해서 업로드 완료 여부 확인이 필요
DEXTUpload.NET.DLL 에 Progress 클래스에
Percent, TotalSize, TransferSize, TimeLeft, TimeElapsed, BytesPerSec, IsUploadClosed의 public 멤버가 존재를 확인
Progress 클래스의 인스턴스를 통해서 진행상태에 대한 멤버에 접근이 가능하여 업로드가 완료 중이 아닌 경우에만 ShowMonitor() 를 호출하도록 하여 refresh 되지 않도록 한다.
protected void Page_Load(object sender, System.EventArgs e)
{
try
{
using (DEXTUpload.NET.FileUploadMonitor monitor = new DEXTUpload.NET.FileUploadMonitor())
{
var progress = new DEXTUpload.NET.Progress();
if (progress.Percent != 0 && progress.Percent <= 100)
{
monitor.ShowMonitor();
}
}
}
catch (Exception ex)
{
Log.LogWrite(ex.ToString());
}
}
* Progress 의 Percent <= 100 이면 ShowMonitor() 가 호출이 되고 이후 monitor.aspx 에서 "<body onload="top.window.close();"</body> 가 호출되어 페이지가 종료되도록 한다.
'dev > asp.net, c#' 카테고리의 다른 글
[asp.net] 클라이언트의 IP주소 얻기 - Request.ServerVariables["HTTP_X_FORWARDED_FOR"], Request.ServerVariables["REMOTE_ADDR"] (0) | 2021.01.18 |
---|---|
[asp.net] Request.ServerVariables Collections 정보 보기 (0) | 2021.01.18 |
[asp.net core 3.1] 파일 로깅 for SeriLog (세리로그) (0) | 2020.12.18 |
[asp.net core 3.1] 파일 로깅 for nLog(엔로그) (0) | 2020.12.07 |
[asp.net core 3.1] 파일 로깅 for log4net(로그4넷) (0) | 2020.12.04 |