2009-03-23 4 views
1

나는 SO를 찾고 this question을 찾았지만, 내가 묻는 것은 그다지 이상하지 않다. 요청의 ContentLength를 검사 할 수있는 IHttpModule을 만들 수 있는지, 그리고 리디렉션되는지 또는 어떻게 든 요청을 밖으로 내 보내서 새 요청을 생성하는지 궁금합니다.Asp.net 요청 길이 제한을 초과하여 파일을 업로드 하시겠습니까?

특히, 이미지 파일 업로드를 처리하려고하는데 플랫 오류 페이지가 아닌 일종의 경고가있는 업로드 페이지로 계속 요청하고 싶습니다. 큰 요청에 부딪히는이 코드는 다음과 같습니다.

private void context_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)sender; 
     HttpContext context = application.Context; 

     if (context.Request.ContentLength > (4 * 1024 * 1024)) 
     { 

     } 
    } 

실행 경로가 원하는대로이 IF 블록에 입력됩니다. 그러나 여기에서, 나는 어디로 가야하는지 정말로 모른다. 이것은 나쁜 접근입니까?

편집 : Fiddler는 (이 모듈없이) IIS가 500 코드를 반환하고 있다고보고합니다. 이 문제를 피하고 코드에서 요청한 페이지에서 200을 반환하고 싶습니다.

답변

4

HTTP의 특성상 모든 요청 데이터를 읽을 때까지 실제로 어떤 것도 반환 할 수 없습니다. 크기가 큰 요청을 받으면 두 가지 옵션이 있습니다.

  • 모든 데이터를 읽고 좋은 오류 페이지를 반환합니다. 이것은 좋은 것처럼 보이지만 사용자가 업로드 할 수없는 메시지를 받기 전에 업로드가 완료 될 때까지 기다려야한다는 것을 의미합니다. 가능한 DOS 공격 구멍을 엽니 다.
  • 즉시 요청을 종료하십시오. 이렇게하면 사용자에게 허황된 단절 페이지가 표시되지만 보안은 유지됩니다.

세 번째 옵션 - 멋진 오류 메시지와 보안을 모두 제공하는 고급 구성 요소를 사용하십시오. 당신은 플래시 전용 구성 요소를 사용할 수 있으며 거기에 많은 것들이 있지만, 물론, 사용자가 플래시가 없다면, 당신은 운이 없어.

+0

rm이 제공하는 링크가 루프에서 ReadEntityBody를 호출하는 이유는 무엇입니까? – Amy

+0

네, 그렇습니다. 그것은 전체 요청에서 읽기 때문에 나중에 응답을 보낼 수 있습니다. –

1

부여 this 당신이하고 싶은 모든이 큰 이미지 업로드의 상태에 대한 사용자 피드백을 제공 있다면, 난 당신이 아약스 또는 Flash 기반 업로드 컴포넌트 중 하나를 사용하는 것이 좋습니다 것

0

읽어 보시기 바랍니다. 거기에는 약 백만 명이 있으며 대부분 사용자 의견이 아주 좋습니다. 또한 대용량 파일을 처리 할 수 ​​있으며 다수의 동시 파일 업로드도 처리 할 수 ​​있습니다.

0

위의 대답은 IIS 7.5에서 작동하지 않습니다. 우리는 마침내 다음을 생각해 냈습니다.

void Application_PreSendRequestHeaders(Object sender, EventArgs e) 
    { 
     if (
      Request.Headers["Content-Length"] != null && 
      int.Parse(Request.Headers["Content-Length"]) > 150000000 && 
      Request.RawUrl.EndsWith("/ProjectReleases.aspx?Mode=Create", StringComparison.OrdinalIgnoreCase)) 
     { 
      try 
      { 
       Response.Redirect("http://anyurl", true); 
      } 
      catch (HttpException ex) 
      { 
       if (String.Compare(ex.Message, "Maximum request length exceeded.", StringComparison.Ordinal) != 0) 
       { 
        Server.ClearError(); 
        Response.ClearHeaders(); 
        Response.Redirect("http://www.edward-williams.com", true); 
       } 
      } 
     } 
    } 

최대 업로드 크기를 수정할 필요가 없었습니다. 최종 버전이 web.config의 값을 기준으로 최대 업로드 크기에 대한 정적 값을 설정하고 사용자 정의 오류 페이지와 해당 홈페이지로 리디렉션되었지만 아이디어를 얻었습니다.

관련 문제