2010-05-03 70 views
39

Vấn đề chính của tôi là tôi muốn hiển thị trang lỗi tùy chỉnh khi tệp được tải lên vượt quá kích thước cho phép (maxRequestLength trong web.config).Hiển thị trang lỗi tùy chỉnh khi tải lên tệp vượt quá kích thước cho phép trong ASP.NET MVC

Khi tệp lớn được tải lên, một HttpException được ném trước khi phương thức hành động tải lên của tôi trong trình điều khiển được gọi. Điều này được mong đợi.

Tôi đã cố gắng nắm bắt ngoại lệ trong thuộc tính tùy chỉnh và cũng để ghi đè OnException trong bộ điều khiển. Tại sao không thể bắt ngoại lệ trong thuộc tính hoặc phương pháp OnException?

Mặc dù có thể có ngoại lệ trong Application_Error trong global.asax nhưng không phải Response.Redirect cũng như Server.Transfer hoạt động để chuyển hướng đến trang lỗi tùy chỉnh. Server.Transfer cho lỗi "không xử lý yêu cầu con" và response.redirect cho lỗi "Http headers sent".

Bất kỳ ý tưởng nào?

Cảm ơn trước!

Marcus

+3

Không phải là câu trả lời cho câu hỏi của bạn. Tôi sử dụng SWFUpload (http://www.swfupload.org/) và đặt giới hạn kích thước tệp. Bằng cách này, khách hàng sẽ không thể bắt đầu tải lên tệp lớn hơn giới hạn. Bạn đặt giới hạn trong JavaScript như vậy: file_size_limit: "20 MB". Xem doc: http://demo.swfupload.org/Documentation –

Trả lời

55

Khi chạy trong IIS7 và trở lên có một tham số:

<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="10485760" /> 
    </requestFiltering> 
    </security> 
</system.webServer> 

Cài đặt mặc định là hơi ít hơn 30 MB.

Đối với các tệp được tải lên có kích thước giữa maxRequestLengthmaxAllowedContentLength IIS7 sẽ ném một HttpException bằng mã HTTP 500 và văn bản tin nhắn Maximum request length exceeded. Khi ngoại lệ này được ném, IIS7 sẽ hủy kết nối ngay lập tức. Vì vậy, HttpModule chuyển hướng trên lỗi này sẽ chỉ hoạt động nếu số HttpException được xử lý và xóa (sử dụng Server.ClearError()) trong Application_Error() trong global.asax.cs.

Đối với các tệp được tải lên có kích thước lớn hơn maxAllowedContentLength IIS7 sẽ hiển thị trang lỗi chi tiết với mã lỗi 404 và subStatusCode 13. Trang lỗi có thể được tìm thấy trong C: \ inetpub \ custerr \ en-US \ 404-13.htm

Để chuyển hướng trên lỗi này trên IIS7, tôi khuyên bạn nên chuyển hướng trên httpErrors để thay thế. Để chuyển hướng đến một hành động khác nhau thiết lập một giá trị nhỏ hơn cho maxAllowedContentLength hơn maxRequestLength trong web.config và cũng thêm dòng sau vào web.config:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" subStatusCode="13" /> 
    <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" 
     path="http://yoursite.com/Error/UploadTooLarge" responseMode="Redirect" /> 
    </httpErrors> 
</system.webServer> 
+0

Làm thế nào để bạn làm điều này với IIS6? – Jonathan

+0

@ Jonathan: Xem câu trả lời này http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc2/2856886#2856886 – Marcus

+1

Một điều quan trọng cần lưu ý là nếu bạn muốn _avoid_ phải đối phó với HTTP 500 _Maximum request length too_ errors, bạn nên đặt cả 'maxRequestLength' và' maxAllowedContentLength' thành _same size_ (trước đây phải được biểu diễn bằng kilobyte trong khi sau trong byte như [giải thích ở đây] (http://stackoverflow.com/a/3853785/26396)). Bằng cách này, sẽ không có yêu cầu có kích thước nằm giữa hai giá trị, chúng chỉ có thể nhỏ hơn hoặc lớn hơn ngưỡng. –

0

Bạn cần tạo một HttpHandler tùy chỉnh sẽ thực hiện việc này cho bạn. ASP.NET sẽ tự động hủy kết nối nếu kích thước tải lên quá lớn (như bạn đã phát hiện ra).

3

Khi chạy trên IIS6, tôi đã giải quyết nó bằng một HttpModule bằng cách xử lý BeginRequest và kiểm tra xem httpApplication.Context.Request.Length có lớn hơn maxRequestLength hay không.

Để có thể chuyển hướng, toàn bộ yêu cầu phải được đọc trước khi chuyển hướng.

Xem ví dụ mã tại liên kết này: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

+2

Phần tiêu cực của giải pháp này là toàn bộ yêu cầu (và tệp) cần phải được đọc trước khi có thể thực hiện chuyển hướng. – Marcus

+0

Đó không phải là một điều xấu mặc dù đó là cách duy nhất. Phương án thay thế là gì? Đầu tiên, có thể phát hiện maxRequestLength vượt quá lỗi trước khi toàn bộ yêu cầu đã được đọc không? Sự kiện này sẽ phải được bắt trong mã, vì vậy bạn có thể chạy một số mã chuẩn bị và gọi Server.Transfer. Thứ hai, nếu bạn có thể làm điều gì đó trước khi toàn bộ yêu cầu được đọc và bạn hủy nó bằng cách nào đó, cách trình duyệt web của người dùng phản hồi như thế nào? Nó có nghĩ rằng kết nối không thành công? – Triynko

1

link Vận tốc EViews là thực sự hữu ích trong việc giải quyết vấn đề này. Như đã nêu, hạn chế duy nhất là toàn bộ yêu cầu (và tệp) cần được đọc trước khi có thể thực hiện chuyển hướng.

Nhưng nó có thể được giới hạn chỉ chạy khi trang mà sự kiểm soát tập tin tải lên là hiện tại bằng cách nạp như thế này

if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx") 
{ 
    //read and process page request 
} 
Các vấn đề liên quan