2010-05-03 4 views
10

사용자가 Web.config에서 사이트에 업로드 할 수있는 파일 크기가 제한됩니다. 설명 된대로 here, 크기가 받아 들여지지 않으면 ConfigurationErrorsException이 throw됩니다. 나는 업로드 요청을 위해 액션 메소드 나 컨트롤러에서 그것을 잡으려고했지만 행운은 없었다. 연결이 재설정되었으므로 오류 페이지가 표시되지 않습니다.maxRequestLength 위반에 대한 ConfigurationErrorsException을 잡는 방법?

BeginRequest 이벤트에서 catch하려고했지만 예외가 처리되지 않아도 처리되지 않았습니다. 여기에 코드입니다 :

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    HttpContext context = ((HttpApplication)sender).Context; 
    try 
    { 
     if (context.Request.ContentLength > maxRequestLength) 
     { 
      IServiceProvider provider = (IServiceProvider)context; 
      HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); 

      // Check if body contains data 
      if (workerRequest.HasEntityBody()) 
      { 
       // get the total body length 
       int requestLength = workerRequest.GetTotalEntityBodyLength(); 
       // Get the initial bytes loaded 
       int initialBytes = 0; 
       if (workerRequest.GetPreloadedEntityBody() != null) 
        initialBytes = workerRequest.GetPreloadedEntityBody().Length; 
       if (!workerRequest.IsEntireEntityBodyIsPreloaded()) 
       { 
        byte[] buffer = new byte[512]; 
        // Set the received bytes to initial bytes before start reading 
        int receivedBytes = initialBytes; 
        while (requestLength - receivedBytes >= initialBytes) 
        { 
         // Read another set of bytes 
         initialBytes = workerRequest.ReadEntityBody(buffer, buffer.Length); 

         // Update the received bytes 
         receivedBytes += initialBytes; 
        } 
        initialBytes = workerRequest.ReadEntityBody(buffer, requestLength - receivedBytes); 
       } 
      } 
     } 
    } 
    catch(HttpException) 
    { 
     context.Response.Redirect(this.Request.Url.LocalPath + "?action=exception"); 
    } 
} 

하지만 난 아직이 얻을 :

Maximum request length exceeded. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Web.HttpException: Maximum request length exceeded. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

업데이트 :

어떤 방법 어쨌든 예외가 발생? 요청을 읽으면 예외가 발생합니다. 전혀 읽지 않으면 브라우저에서 "101 Connection Reset"이 표시됩니다. 여기서 무엇을 할 수 있습니까? 액션 메소드에서

+0

, 내가 봤이 발견 : http://stackoverflow.com을/questions/2966076/getting-file-size-in-javascript. 이 주제에 따르면 일반 Javascript로 파일 크기를 알아낼 방법이 없습니다 (Flash, ActiveX 또는 HTML 5를 사용하고 싶지 않습니다!). 정확하게 이해하고 있습니까? – celticharp

+0

@necronio 그렇게 생각합니다. –

답변

1

클라이언트 쪽에서 도움없이 바로 수행 할 방법이 없습니다. 모든 요청을 읽지 않으면 요청이 너무 길지를 판단 할 수 없습니다. 결국 각 요청을 읽으면 누구든지 서버를 계속 사용하게됩니다. 콘텐츠 길이를보고 요청을 삭제하면 다른 쪽에서는 연결 문제가 있다고 생각할 것입니다. 오류 처리와 관련하여 할 수있는 일은 없으며 HTTP의 단점입니다.

Flash 또는 Javascript 구성 요소를 사용하면 문제가 발생하지 않으므로 올바르게 사용할 수 있습니다.

5

당신 캔트 캐치 오류 예외가 이전에 제공되지만 파일 크기가 오류가 발생하는 한계 HttpException을 초과 할 때 당신이 여기

protected void Application_Error() { 
    var lastError = Server.GetLastError(); 
    if(lastError !=null && lastError is HttpException && lastError.Message.Contains("exceed")) { 
     Response.Redirect("~/errors/RequestLengthExceeded"); 
     } 
    } 

Actualy을 잡을 수 렸기 때문에.

콘텐츠에 IIS 제한이 있습니다 (응용 프로그램에서 캐치 할 수 없음). IIS 7

HTTP 오류 404.13를 throw - 요청 필터링 모듈은 요청 콘텐츠 길이를 초과하는 요청을 거부 할 를 구성 찾을 수 없습니다.

Google에 알려 주시면이 iis 오류에 대한 많은 정보를 얻을 수 있습니다.

+0

아직 IIS에서 호스팅하지 않았습니다. 나는 개발 서버에서이 서버를 사용하려고 노력하고 있지만 계속 염두에 두겠다. 나는 global.asax에서 처리해야한다고 생각하고 있나? –

+0

예, global.asax –

+0

이상합니다. 오류를 잡아낼 수는 있지만 다른 곳으로 리디렉션 할 수는 없습니다. 업로드 URL에 사용됩니다. 다른 사람이 같은 문제가있는 것처럼 보입니다. (http://forums.asp.net/p/845691/957981.aspx#957981) –

0

나는이 100 % 아니지만, 난 당신이 변화 시도한다면 도움이 될 생각 :

context.Response.Redirect(this.Request.Url.LocalPath + "?action=exception");

내 생각이 (가) 과잉이다

Server.Transfer(this.Request.Url.LocalPath + "?action=exception,false)

에 max-request-length 요청은 여전히 ​​Redirect 호출에서 처리되고 있지만 양식 데이터를 버리라고하면 최대 요청 길이가되고 다르게 동작 할 수 있습니다.

보장은 없지만 확인하기 쉽습니다.

+0

Server.Transfer는 MVC에서 작동하지 않습니다. Response.Redirect는 실제로 동일한 작업을 수행합니다. 문제는 브라우저가 모든 것을 읽지 않고 101을 던지면 연결 문제가 있다고 생각합니다. –

0
catch (Exception ex) 
    { 
     if (ex is HttpException && (ex as HttpException).WebEventCode == 3004) 
     { 
      //-- you can now inform the client that file uploaded was too large. 
     } 
     else 
      throw; 
    } 
0

Application_Error 처리기 내에서 '최대 요청 길이 초과'예외를 잡아서 리디렉션하고 싶다는 점에서 비슷한 문제가 있습니다.

(차이점은 ASP.Net 웹 API를 사용하여 REST 서비스를 작성하고 오류 페이지로 리디렉션하지 않고 적절한 응답을 리턴하는 오류 컨트롤러로 리디렉션하고 싶다는 것입니다).

그러나 내가 발견 한 것은 ASP.Net 개발 서버를 통해 응용 프로그램을 실행할 때 Response.Redirect가 작동하지 않는 것입니다. Fiddler는 "ReadResponse() 실패 : 서버가이 요청에 대한 응답을 반환하지 않았습니다."라고 말합니다.

내 클라이언트 (Chrome 용 고급 REST 클라이언트)는 단순히 "0 응답 없음"을 표시합니다.

그런 다음 개발 컴퓨터에서 IIS의 로컬 복사본을 통해 응용 프로그램을 실행하면 리디렉션이 올바르게 작동합니다.

확실히 Response.Redirect가 ASP.Net 개발 서버에서 작동하지 않는다고 말할 수는 없지만 확실히 내 상황에서는 작동하지 않습니다.

그래서 IIS Express 또는 개발 서버 대신 IIS를 통해 응용 프로그램을 실행하고 다른 결과가 나타나는지 확인하는 것이 좋습니다.

Visual Studio에서 웹 프로젝트의 웹 서버를 지정하는 방법에 대한 링크를 참조하십시오 :

나는 당신의 대답에 따라 싶었다

http://msdn.microsoft.com/en-us/library/ms178108(v=vs.100).aspx

관련 문제