"최대 요청 길이 초과"포착


112

업로드 기능을 작성 httpRuntime중이며 web.config 에 지정된 최대 크기 (최대 크기는 5120으로 설정) 보다 큰 파일에서 "System.Web.HttpException : Maximum request length exceeded"를 잡는 데 문제가 있습니다 . 간단한 <input>파일을 사용하고 있습니다.

문제는 업로드 버튼의 클릭 이벤트 전에 예외가 발생하고 내 코드가 실행되기 전에 예외가 발생한다는 것입니다. 그렇다면 예외를 어떻게 포착하고 처리합니까?

편집 : 예외는 즉시 발생하므로 느린 연결로 인한 시간 초과 문제가 아니라고 확신합니다.


5
누구든지 MVC로 이것을 시도 했습니까? 올바른 방법으로 예외를 잡을 수있는 것 같지만 중지 할 수 없습니다. 오류 페이지를 렌더링하려고 할 때마다 동일한 예외가 발생합니다.
Andy

이 오류 메시지는 컨트롤러에 도달하기 전에 IIS에서 발생합니다. 파일이 최대 업로드 제한 (웹 구성에 설정)을 초과했음을 사용자에게 알리려면 onchange 이벤트를 사용하여 JS를 통해 파일 크기를 직접 확인할 수 있습니다. 예를 들어 <input type="file" id="upload" name="upload" onchange="showFileSize();" />Inside showFileSize()를 통해 파일 크기에 따라 오류 메시지를 표시 var input = document.getElementById("upload"); var file = input.files[0];하고 html 태그를 추가 할 수 있습니다.
Alfred Wallace

답변:


97

불행히도 그러한 예외를 잡는 쉬운 방법은 없습니다. 내가하는 일은 페이지 수준에서 OnError 메서드를 재정의하거나 global.asax의 Application_Error를 재정의 한 다음 최대 요청 실패인지 확인한 다음 오류 페이지로 전송하는 것입니다.

protected override void OnError(EventArgs e) .....


private void Application_Error(object sender, EventArgs e)
{
    if (GlobalHelper.IsMaxRequestExceededException(this.Server.GetLastError()))
    {
        this.Server.ClearError();
        this.Server.Transfer("~/error/UploadTooLarge.aspx");
    }
}

해킹이지만 아래 코드가 저에게 효과적입니다.

const int TimedOutExceptionCode = -2147467259;
public static bool IsMaxRequestExceededException(Exception e)
{
    // unhandled errors = caught at global.ascx level
    // http exception = caught at page level

    Exception main;
    var unhandled = e as HttpUnhandledException;

    if (unhandled != null && unhandled.ErrorCode == TimedOutExceptionCode)
    {
        main = unhandled.InnerException;
    }
    else
    {
        main = e;
    }


    var http = main as HttpException;

    if (http != null && http.ErrorCode == TimedOutExceptionCode)
    {
        // hack: no real method of identifying if the error is max request exceeded as 
        // it is treated as a timeout exception
        if (http.StackTrace.Contains("GetEntireRawContent"))
        {
            // MAX REQUEST HAS BEEN EXCEEDED
            return true;
        }
    }

    return false;
}

2
감사. OnError는 작동하지 않았지만 Application_Error는 작동했습니다. 우리는 실제로 이것에 대한 핸들러를 가지고 있지만 누군가 코드에서 그것을 껐습니다.
Marcus L

2 년 전이라도이게 지금까지 잘 됐는지 묻고 싶어요. 'GetEntireRawContent'의 문자열 비교가 제대로 작동합니까? 이것이 시간 초과 문제라고 생각하지 않습니다. 이 문제에 대해 어딘가에 흐릿하게 지적한 사람이 있습니까?
Elaine

@Elaine 예이 기술은 여전히 ​​ASP.Net 4.0에서 작동합니다. 최대 요청 길이보다 큰 요청을 업로드하려고하면 ASP.Net에서 시간 초과 코드와 함께 HttpException이 발생합니다. 리플렉터를 사용하여 System.Web.HttpRequest.GetEntireRawContent ()를 살펴보십시오.
Damien McGivern

12
@ sam-rueby 현지화로 인해 변경 될 수있는 문자열 오류 메시지에 답장하고 싶지 않았습니다.
Damien McGivern

4
.NET 4.0 이상의 경우 최대 요청 크기가 초과되었는지 확인하는 더 좋은 방법이 있습니다. HttpException에 대해이 조건을 확인할 수 있습니다. httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge-System.Web.Management.WebEventCodes 사용
mco

58

GateKiller가 maxRequestLength를 변경해야한다고 말했듯이. 업로드 속도가 너무 느린 경우 executionTimeout을 변경해야 할 수도 있습니다. 이러한 설정 중 어느 것도 너무 크지 않도록하십시오. 그렇지 않으면 DOS 공격에 노출 될 것입니다.

executionTimeout의 기본값은 360 초 또는 6 분입니다.

httpRuntime 요소를 사용하여 maxRequestLength 및 executionTimeout을 변경할 수 있습니다 .

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" executionTimeout="1200" />
    </system.web>
</configuration>

편집하다:

이미 언급했듯이 예외를 처리하려면 Global.asax에서 처리해야합니다. 다음은 코드 예제에 대한 링크 입니다.


2
답장을 보내 주셔서 감사하지만 GK의 답변에 대한 의견에서 말했듯이 이것은 실제로 내 문제를 해결하지 못합니다. 예외가 즉시 발생하므로 시간 초과 문제도 아닙니다. 더 명확하게 질문을 편집하겠습니다.
Marcus L

4
코드 예제 URL은 사용할 수없는 페이지를 가리 킵니다. 누구든지이 문제를 해결할 수 있습니까?
2010 년

20

web.config에서 최대 요청 길이를 늘리면이 문제를 해결할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime maxRequestLength="102400" />
    </system.web>
</configuration>

위의 예는 100Mb 제한에 대한 것입니다.


18
예, 아니요. 한계를 더 밀어 붙이지 만 실제로 예외를 처리하지는 않습니다. 누군가가 101MB 이상을 업로드하려고하면 여전히 동일한 문제가 발생합니다. 제한은 실제로 5Mb 여야합니다.
Marcus L

10

클라이언트 측 유효성 검사를 원하므로 예외를 던질 필요가 적어 클라이언트 측 파일 크기 유효성 검사를 구현할 수 있습니다.

참고 : 이는 HTML5를 지원하는 브라우저에서만 작동합니다. http://www.html5rocks.com/en/tutorials/file/dndfiles/

<form id="FormID" action="post" name="FormID">
    <input id="target" name="target" class="target" type="file" />
</form>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript" language="javascript">

    $('.target').change(function () {

        if (typeof FileReader !== "undefined") {
            var size = document.getElementById('target').files[0].size;
            // check file size

            if (size > 100000) {

                $(this).val("");

            }
        }

    });

</script>


9

Damien McGivern이 언급 한 Hi 솔루션은 IIS6에서만 작동합니다.

IIS7 및 ASP.NET 개발 서버에서는 작동하지 않습니다. "404-파일 또는 디렉토리를 찾을 수 없음"이라는 페이지가 나타납니다.

어떤 아이디어?

편집하다:

알겠습니다 ...이 솔루션은 여전히 ​​ASP.NET 개발 서버에서 작동하지 않지만 제 경우에는 IIS7에서 작동하지 않는 이유가 있습니다.

그 이유는 IIS7에는 기본적으로 30000000 바이트 (30MB보다 약간 적음) 인 업로드 파일 캡을 부과하는 기본 제공 요청 스캔이 있기 때문입니다.

그리고 Damien McGivern이 언급 한 솔루션을 테스트하기 위해 크기가 100MB 인 파일을 업로드하려고했습니다 (maxRequestLength = "10240"즉 web.config에서 10MB 사용). 이제 10MB보다 크고 30MB보다 작은 파일을 업로드하면 페이지가 지정된 오류 페이지로 리디렉션됩니다. 그러나 파일 크기가 30MB보다 크면 "404-파일 또는 디렉토리를 찾을 수 없음"을 표시하는 추악한 내장 오류 페이지가 표시됩니다.

따라서이를 방지하려면 최대 값을 높여야합니다. IIS7에서 웹 사이트에 대해 허용 된 요청 콘텐츠 길이. 다음 명령을 사용하여 수행 할 수 있습니다.

appcmd set config "SiteName" -section:requestFiltering -requestLimits.maxAllowedContentLength:209715200 -commitpath:apphost

나는 최대를 설정했습니다. 콘텐츠 길이는 200MB입니다.

이 설정을 수행 한 후 100MB의 파일을 업로드하려고하면 페이지가 내 오류 페이지로 성공적으로 리디렉션됩니다.

자세한 내용은 http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx 를 참조하십시오.


죄송합니다! 질문을 답변으로 추가했는데 기존 게시물에 댓글을 추가하는 방법을 모르겠습니다.
Vinod T. Patil

1
더 많은 담당자가 필요합니다. 게시물에 댓글을 달 수 있습니다. 현재 담당자로 할 수있는 작업과 할 수없는 작업에 대한 자세한 내용은 FAQ를 참조하세요.
비틀 거리는

7

다음은 "해킹"을 포함하지 않지만 ASP.NET 4.0 이상이 필요한 대체 방법입니다.

//Global.asax
private void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError();
    var httpException = ex as HttpException ?? ex.InnerException as HttpException;
    if(httpException == null) return;

    if(httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //handle the error
        Response.Write("Sorry, file is too big"); //show this message for instance
    }
}

4

이 작업을 수행하는 한 가지 방법은 위에서 이미 설명한대로 web.config에서 최대 크기를 설정하는 것입니다.

<system.web>         
    <httpRuntime maxRequestLength="102400" />     
</system.web>

그런 다음 업로드 이벤트를 처리 할 때 크기를 확인하고 특정 양을 초과하면 트랩 할 수 있습니다.

protected void btnUploadImage_OnClick(object sender, EventArgs e)
{
    if (fil.FileBytes.Length > 51200)
    {
         TextBoxMsg.Text = "file size must be less than 50KB";
    }
}

1
이것은 작동하지 않습니다. 클릭 이벤트는 트리거되지 않습니다. 예외는 전에 발생합니다.
Lombas


3

IIS 7 이상 :

web.config 파일 :

<system.webServer>
  <security >
    <requestFiltering>
      <requestLimits maxAllowedContentLength="[Size In Bytes]" />
    </requestFiltering>
  </security>
</system.webServer>

그런 다음 다음과 같이 코드 뒤에서 체크인 할 수 있습니다.

If FileUpload1.PostedFile.ContentLength > 2097152 Then ' (2097152 = 2 Mb)
  ' Exceeded the 2 Mb limit
  ' Do something
End If

web.config의 [Size In Bytes]가 업로드하려는 파일의 크기보다 큰지 확인하면 404 오류가 발생하지 않습니다. 그런 다음 ContentLength를 사용하여 코드 뒤에서 파일 크기를 확인할 수 있습니다.


2

아시다시피 최대 요청 길이는 곳 에서 구성됩니다 .

  1. maxRequestLength -ASP.NET 앱 수준에서 제어
  2. maxAllowedContentLength-아래 <system.webServer>, IIS 수준에서 제어

첫 번째 경우는이 질문에 대한 다른 답변으로 다룹니다.

두 번째 를 잡으려면 global.asax에서이 작업을 수행해야합니다.

protected void Application_EndRequest(object sender, EventArgs e)
{
    //check for the "file is too big" exception if thrown at the IIS level
    if (Response.StatusCode == 404 && Response.SubStatusCode == 13)
    {
        Response.Write("Too big a file"); //just an example
        Response.End();
    }
}

1

태그 뒤

<security>
     <requestFiltering>
         <requestLimits maxAllowedContentLength="4500000" />
     </requestFiltering>
</security>

다음 태그를 추가

 <httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" subStatusCode="13" />
  <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" path="http://localhost/ErrorPage.aspx" responseMode="Redirect" />
</httpErrors>

오류 페이지에 URL을 추가 할 수 있습니다 ...


0

web.config에서 최대 요청 길이와 실행 시간을 늘려이 문제를 해결할 수 있습니다.

-최대 실행 시간을 1200 년 이후로 명시하십시오.

<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="102400" executionTimeout="1200" /> </system.web> </configuration>

0

EndRequest 이벤트에서 잡는 것은 어떻습니까?

protected void Application_EndRequest(object sender, EventArgs e)
    {
        HttpRequest request = HttpContext.Current.Request;
        HttpResponse response = HttpContext.Current.Response;
        if ((request.HttpMethod == "POST") &&
            (response.StatusCode == 404 && response.SubStatusCode == 13))
        {
            // Clear the response header but do not clear errors and
            // transfer back to requesting page to handle error
            response.ClearHeaders();
            HttpContext.Current.Server.Transfer(request.AppRelativeCurrentExecutionFilePath);
        }
    }

0

다음을 통해 확인할 수 있습니다.

        var httpException = ex as HttpException;
        if (httpException != null)
        {
            if (httpException.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
            {
                // Request too large

                return;

            }
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.