Piszę funkcję wysyłania i mam problemy z wychwyceniem „System.Web.HttpException: Przekroczono maksymalną długość żądania” w przypadku plików większych niż określony maksymalny rozmiar httpRuntime
w web.config (maksymalny rozmiar ustawiony na 5120). Używam prostego <input>
pliku.
Problem polega na tym, że wyjątek jest zgłaszany przed zdarzeniem kliknięcia przycisku przesyłania, a wyjątek występuje przed uruchomieniem mojego kodu. Jak więc złapać i obsłużyć wyjątek?
EDYCJA: Wyjątek jest rzucany natychmiast, więc jestem prawie pewien, że nie jest to problem z limitem czasu z powodu wolnych połączeń.
c#
asp.net
httpexception
Marcus L.
źródło
źródło
<input type="file" id="upload" name="upload" onchange="showFileSize();" />
InsideshowFileSize()
, możesz wyświetlić komunikat o błędzie w oparciu o rozmiar pliku za pośrednictwemvar input = document.getElementById("upload"); var file = input.files[0];
i dołączyć znacznik HTML.Odpowiedzi:
Niestety nie ma łatwego sposobu na złapanie takiego wyjątku. To, co robię, to albo nadpisuję metodę OnError na poziomie strony, albo Application_Error w global.asax, a następnie sprawdzam, czy była to awaria maksymalnego żądania, a jeśli tak, przenoszę na stronę błędu.
To hack, ale poniższy kod działa dla mnie
źródło
httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge
- używając System.Web.Management.WebEventCodesJak powiedział GateKiller, musisz zmienić maxRequestLength. Może być także konieczna zmiana ExecutionTimeout w przypadku, gdy prędkość wysyłania jest zbyt niska. Pamiętaj, że nie chcesz, aby którekolwiek z tych ustawień było zbyt duże, w przeciwnym razie będziesz otwarty na ataki DOS.
Wartość domyślna dla ExecutionTimeout to 360 sekund lub 6 minut.
Możesz zmienić maxRequestLength i ExecutionTimeout za pomocą elementu httpRuntime .
EDYTOWAĆ:
Jeśli chcesz obsłużyć wyjątek niezależnie od tego, jak już wspomniano, musisz to zrobić w Global.asax. Oto link do przykładu kodu .
źródło
Możesz rozwiązać ten problem, zwiększając maksymalną długość żądania w pliku web.config:
Powyższy przykład dotyczy limitu 100 Mb.
źródło
Jeśli chcesz również walidacji po stronie klienta, aby zmniejszyć potrzebę zgłaszania wyjątków, możesz spróbować zaimplementować walidację rozmiaru pliku po stronie klienta.
Uwaga: działa to tylko w przeglądarkach obsługujących HTML5. http://www.html5rocks.com/en/tutorials/file/dndfiles/
źródło
Witam rozwiązanie wspomniane przez Damiena McGivern, działa tylko na IIS6,
Nie działa w usługach IIS7 i ASP.NET Development Server. Na stronie pojawia się komunikat „404 - Nie znaleziono pliku lub katalogu”.
Jakieś pomysły?
EDYTOWAĆ:
Rozumiem ... To rozwiązanie nadal nie działa na serwerze deweloperskim ASP.NET, ale mam powód, dla którego w moim przypadku nie działa na IIS7.
Powodem jest to, że IIS7 ma wbudowane skanowanie żądań, które narzuca limit pliku do przesłania, który domyślnie wynosi 30000000 bajtów (czyli nieco mniej niż 30 MB).
Próbowałem wgrać plik o rozmiarze 100 MB, aby przetestować rozwiązanie wspomniane przez Damiena McGivern (z maxRequestLength = "10240" czyli 10MB w web.config). Teraz, jeśli prześlę plik o rozmiarze> 10 MB i <30 MB, strona zostanie przekierowana na określoną stronę błędu. Ale jeśli rozmiar pliku wynosi> 30 MB, zostanie wyświetlona brzydka wbudowana strona błędu wyświetlająca „404 - Nie znaleziono pliku lub katalogu”.
Aby tego uniknąć, musisz zwiększyć maks. dozwolona długość treści żądania dla Twojej witryny w usługach IIS7. Można to zrobić za pomocą następującego polecenia,
Ustawiłem max. długość zawartości do 200 MB.
Po wykonaniu tego ustawienia strona jest pomyślnie przekierowywana na moją stronę błędu, gdy próbuję przesłać plik o wielkości 100 MB
Więcej informacji można znaleźć pod adresem http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx .
źródło
Oto alternatywny sposób, który nie obejmuje żadnych „hacków”, ale wymaga ASP.NET 4.0 lub nowszego:
źródło
Jednym ze sposobów jest ustawienie maksymalnego rozmiaru w pliku web.config, jak już wspomniano powyżej, np
wtedy kiedy obsłużysz zdarzenie uploadu, sprawdź rozmiar i jeśli przekracza określoną kwotę, możesz go złapać np
źródło
Rozwiązanie, które działa z usługami IIS7 i nowszymi: Wyświetl niestandardową stronę błędu, gdy przekazywanie pliku przekracza dozwolony rozmiar w ASP.NET MVC
źródło
W usługach IIS 7 i nowszych:
plik web.config:
Następnie możesz sprawdzić kod za, na przykład:
Po prostu upewnij się, że [Rozmiar w bajtach] w pliku web.config jest większy niż rozmiar pliku, który chcesz przesłać, wtedy błąd 404 nie zostanie wyświetlony. Następnie możesz sprawdzić rozmiar pliku w kodzie za pomocą ContentLength, co byłoby znacznie lepsze
źródło
Jak zapewne wiesz, maksymalna długość żądania jest skonfigurowana w DWÓCH miejscach.
maxRequestLength
- kontrolowane z poziomu aplikacji ASP.NETmaxAllowedContentLength
- pod<system.webServer>
kontrolą na poziomie IISPierwszy przypadek jest objęty innymi odpowiedziami na to pytanie.
Aby złapać DRUGI , musisz to zrobić w global.asax:
źródło
Po tagu
dodaj następujący tag
możesz dodać adres URL do strony błędu ...
źródło
Możesz rozwiązać ten problem, zwiększając maksymalną długość żądania i limit czasu wykonania w pliku web.config:
-Proszę wyjaśnić maksymalny czas wykonania, który upłynął później niż 1200
źródło
Co powiesz na złapanie go na imprezie EndRequest?
źródło
Można to sprawdzić poprzez:
źródło