Estou escrevendo uma função de upload e tenho problemas para capturar "System.Web.HttpException: Comprimento máximo da solicitação excedido" com arquivos maiores do que o tamanho máximo especificado httpRuntime
em web.config (tamanho máximo definido como 5120). Estou usando um simples <input>
para o arquivo.
O problema é que a exceção é lançada antes do evento de clique do botão de upload e a exceção ocorre antes de meu código ser executado. Então, como faço para capturar e tratar a exceção?
EDIT: A exceção é lançada instantaneamente, então tenho certeza que não é um problema de tempo limite devido a conexões lentas.
c#
asp.net
httpexception
Marcus L
fonte
fonte
<input type="file" id="upload" name="upload" onchange="showFileSize();" />
InsideshowFileSize()
, você pode exibir uma mensagem de erro com base no tamanho do arquivo viavar input = document.getElementById("upload"); var file = input.files[0];
e anexar uma tag html.Respostas:
Infelizmente, não há maneira fácil de detectar essa exceção. O que faço é substituir o método OnError no nível da página ou o Application_Error em global.asax e, em seguida, verificar se foi uma falha de solicitação máxima e, em caso afirmativo, transferir para uma página de erro.
É um hack, mas o código abaixo funciona para mim
fonte
httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge
- usando System.Web.Management.WebEventCodesComo o GateKiller disse, você precisa alterar o maxRequestLength. Você também pode precisar alterar o executionTimeout caso a velocidade de upload seja muito lenta. Observe que você não deseja que nenhuma dessas configurações seja muito grande, caso contrário, você estará aberto a ataques DOS.
O padrão para executionTimeout é 360 segundos ou 6 minutos.
Você pode alterar maxRequestLength e executeTimeout com o elemento httpRuntime .
EDITAR:
Se você quiser tratar a exceção independentemente, como já foi dito, você precisará tratá-la em Global.asax. Aqui está um link para um exemplo de código .
fonte
Você pode resolver isso aumentando o comprimento máximo da solicitação em seu web.config:
O exemplo acima é para um limite de 100 Mb.
fonte
Se você também deseja uma validação do lado do cliente, para que haja menos necessidade de lançar exceções, você pode tentar implementar a validação do tamanho do arquivo do lado do cliente.
Nota: Isso só funciona em navegadores que suportam HTML5. http://www.html5rocks.com/en/tutorials/file/dndfiles/
fonte
Olá, solução mencionada por Damien McGivern, Funciona apenas no IIS6,
Não funciona no IIS7 e no ASP.NET Development Server. Recebo a página exibindo "404 - Arquivo ou diretório não encontrado."
Alguma ideia?
EDITAR:
Entendi ... Essa solução ainda não funciona no ASP.NET Development Server, mas entendi o motivo pelo qual ela não estava funcionando no IIS7 no meu caso.
A razão é que o IIS7 tem uma varredura de solicitação embutida que impõe um limite de arquivo de upload que é padronizado para 30000000 bytes (que é um pouco menos que 30 MB).
E eu estava tentando fazer upload de um arquivo de tamanho 100 MB para testar a solução mencionada por Damien McGivern (com maxRequestLength = "10240" ou seja, 10 MB em web.config). Agora, se eu carregar o arquivo de tamanho> 10 MB e <30 MB, a página será redirecionada para a página de erro especificada. Mas se o tamanho do arquivo for> 30 MB, ele mostra a página de erro embutida feia exibindo "404 - Arquivo ou diretório não encontrado."
Portanto, para evitar isso, você deve aumentar o máximo. permitido comprimento de conteúdo de solicitação para seu site no IIS7. Isso pode ser feito usando o seguinte comando,
Eu defini o máximo comprimento do conteúdo de 200 MB.
Depois de fazer essa configuração, a página é redirecionada com sucesso para minha página de erro quando tento fazer upload de um arquivo de 100 MB
Consulte http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx para obter mais detalhes.
fonte
Esta é uma maneira alternativa, que não envolve nenhum "hacks", mas requer ASP.NET 4.0 ou posterior:
fonte
Uma maneira de fazer isso é definir o tamanho máximo em web.config como já foi declarado acima, por exemplo
então, quando você manipular o evento de upload, verifique o tamanho e se for superior a uma quantidade específica, você pode prendê-lo, por exemplo
fonte
Uma solução que funciona com IIS7 e superior: Exibir página de erro personalizada quando o upload do arquivo exceder o tamanho permitido na ASP.NET MVC
fonte
No IIS 7 e além:
arquivo web.config:
Você pode então fazer o check-in do código, assim:
Apenas certifique-se de que o [Tamanho em bytes] no web.config seja maior do que o tamanho do arquivo que você deseja enviar, então você não receberá o erro 404. Você pode então verificar o tamanho do arquivo no código por trás usando ContentLength, que seria muito melhor
fonte
Como você provavelmente sabe, o comprimento máximo da solicitação é configurado em DOIS lugares.
maxRequestLength
- controlado no nível do aplicativo ASP.NETmaxAllowedContentLength
- sob<system.webServer>
, controlado no nível do IISO primeiro caso é coberto por outras respostas a esta pergunta.
Para capturar o SEGUNDO, você precisa fazer isso em global.asax:
fonte
Depois da etiqueta
adicione a seguinte tag
você pode adicionar o Url à página de erro ...
fonte
Você pode resolver isso aumentando a duração máxima da solicitação e o tempo limite de execução em seu web.config:
-Por favor, esclareça o tempo máximo de execução, ralador então 1200
fonte
Que tal pegá-lo no evento EndRequest?
fonte
Pode ser verificado via:
fonte