"최대 요청 길이 초과됨" 캐치
업로드 기능을 쓰고 있는데 "시스템"을 잡는 데 문제가 있습니다.Web.HttpException: "최대 요청 길이 초과됨"(지정된 최대 크기보다 큰 파일 포함)httpRuntime
web.config(최대 크기가 5120으로 설정됨)에 있습니다.나는 간단한 것을 사용하고 있습니다.<input>
파일용으로.
문제는 업로드 버튼의 클릭 이벤트 이전에 예외가 발생하고 내 코드가 실행되기 전에 예외가 발생한다는 것입니다.그럼 어떻게 예외를 파악하고 처리해야 합니까?
편집: 예외는 즉시 적용되므로 연결 속도가 느려 시간 초과 문제가 아니라고 확신합니다.
불행히도 그런 예외를 쉽게 잡을 수 있는 방법은 없습니다.내가 하는 일은 페이지 수준에서 OnError 메서드를 재정의하거나 global.asax의 Application_Error를 재정의한 다음 Max Request 실패인지 확인하고 오류 페이지로 전송합니다.
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;
}
GateKiller가 말했듯이 maxRequestLength를 변경해야 합니다.실행을 변경해야 할 수도 있습니다.업로드 속도가 너무 느린 경우 시간 초과.이러한 설정 중 하나를 너무 크게 설정하지 않으면 DOS 공격에 노출됩니다.
실행의 기본값시간 초과는 360초 또는 6분입니다.
maxRequestLength 및 실행을 변경할 수 있습니다.httpRuntime 요소를 사용한 시간 초과입니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<httpRuntime maxRequestLength="102400" executionTimeout="1200" />
</system.web>
</configuration>
편집:
이미 언급한 대로 예외를 처리하려면 Global.asax에서 처리해야 합니다.다음은 코드 예제에 대한 링크입니다.
web.config에서 최대 요청 길이를 늘리면 이 문제를 해결할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<httpRuntime maxRequestLength="102400" />
</system.web>
</configuration>
위의 예는 100Mb 제한에 대한 것입니다.
클라이언트 측 유효성 검사를 수행하여 예외를 발생시킬 필요가 없는 경우 클라이언트 측 파일 크기 유효성 검사를 구현할 수 있습니다.
참고: 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>
Damien McGivern이 언급한 안녕하세요. IIS6에서만 작동합니다.
IIS7 및 ASP에서는 작동하지 않습니다.NET 개발 서버."404 - 파일 또는 디렉토리를 찾을 수 없습니다"가 표시되는 페이지가 나타납니다.
아이디어 있어요?
편집:
알았어요...이 솔루션은 여전히 ASP에서 작동하지 않습니다.NET Development Server입니다만, 제 경우 IIS7에서 작동하지 않는 이유를 알게 되었습니다.
IIS7에는 기본적으로 30000000바이트(30MB보다 약간 작은)로 설정된 업로드 파일 캡이 적용되는 기본 요청 검색 기능이 있기 때문입니다.
그리고 Damien McGivern이 언급한 솔루션을 테스트하기 위해 100MB 크기의 파일을 업로드하려고 했습니다(web.config에서 maxRequestLength="10240" 사용).이제 크기가 10MB 이상이고 30MB 미만인 파일을 업로드하면 지정된 오류 페이지로 페이지가 리디렉션됩니다.그러나 파일 크기가 30MB 이상이면 "404 - File or directory not found"(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 을 참조하십시오.
여기에 "해킹"이 포함되지 않고 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
}
}
한 가지 방법은 위에서 이미 설명한 대로 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";
}
}
IIS7 이상에서 작동하는 솔루션: 파일 업로드가 ASP에서 허용된 크기를 초과할 때 사용자 지정 오류 페이지를 표시합니다.NET MVC
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를 사용하여 코드 뒤에 있는 파일 크기를 확인할 수 있습니다. 훨씬 더 좋습니다.
아시다시피 최대 요청 길이는 두 곳에서 구성됩니다.
maxRequestLength
ASP에서 제어됩니다. 앱 앱벨레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();
}
}
파일 크기를 확인하기 위해 FileUpload 컨트롤과 클라이언트 사이드 스크립트를 사용하고 있습니다.
HTML(OnClientClick - OnClick 파일 이름):
<asp:FileUpload ID="FileUploader" runat="server" />
<br />
<asp:Button ID="btnUpload" Text="Upload" runat="server" OnClientClick="return checkFileSize()" OnClick="UploadFile" />
<br />
<asp:Label ID="lblMessage" runat="server" CssClass="lblMessage"></asp:Label>
그런 다음 스크립트(크기가 너무 크면 '거짓 반환': OnClick을 취소합니다):
function checkFileSize()
{
var input = document.getElementById("FileUploader");
var lbl = document.getElementById("lblMessage");
if (input.files[0].size < 4194304)
{
lbl.className = "lblMessage";
lbl.innerText = "File was uploaded";
}
else
{
lbl.className = "lblError";
lbl.innerText = "Your file cannot be uploaded because it is too big (4 MB max.)";
return false;
}
}
태그 후
<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을 추가할 수 있습니다...
web.config에서 최대 요청 길이와 실행 시간 제한을 늘리면 이 문제를 해결할 수 있습니다.
-최대 실행 시간이 1200 이상임을 명확히 해주십시오.
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <httpRuntime maxRequestLength="102400" executionTimeout="1200" /> </system.web> </configuration>
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);
}
}
다음을 통해 확인할 수 있습니다.
var httpException = ex as HttpException;
if (httpException != null)
{
if (httpException.WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
{
// Request too large
return;
}
}
Martin van Bergeijk의 답변에 따라 제출 전에 실제로 파일을 선택했는지 확인하기 위해 if block을 추가했습니다.
if(input.files[0] == null)
{lbl.innertext = "You must select a file before selecting Submit"}
return false;
언급URL : https://stackoverflow.com/questions/665453/catching-maximum-request-length-exceeded
'programing' 카테고리의 다른 글
node.js if ___name__ == '__main__'인 경우 python의 node.js에 해당합니다. (0) | 2023.05.16 |
---|---|
org.dll.tomcat.dll.bcel.class 파일입니다.클래스 형식 예외:상수 풀의 바이트 태그가 잘못되었습니다. 15 (0) | 2023.05.16 |
에서 마크업을 주석 처리할 수 있는 방법이 있습니까?ASPX 페이지? (0) | 2023.05.16 |
Python 3의 문자열 형식 (0) | 2023.05.16 |
Swift: '#if DEBUG'와 같은 PRECPURG 플래그를 사용하여 API 키를 구현하는 방법은 무엇입니까? (0) | 2023.05.16 |