ASP.NET - como mostrar uma página de erro ao fazer upload de arquivos grandes (Comprimento máximo solicitação excedido)?

StackOverflow https://stackoverflow.com/questions/126167

Pergunta

Aplicação capaz de erro de registro no OnError, mas não somos capazes de fazer qualquer redirecionamento ou assim para mostrar algo meaningfull para o usuário. Alguma ideia? Eu sei que podemos definir maxRequestLength no web.config, mas o usuário de qualquer maneira pode exceder esse limite e alguns necessidade erro normal a ser exibido.

Foi útil?

Solução

Como você diz que pode maxRequestLength configuração no seu web.config (substituindo o 4MB padrão do seu machine.config) e se esse limite for excedido você costuma receber um erro HTTP 401.1.

A fim de lidar com um erro HTTP genéricos a nível da aplicação você pode configurar uma seção CustomError em seu web.config dentro da seção system.web:

<system.web>
   <customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>

Toda vez que o erro é mostrado o usuário será redirecionado para sua página de erro personalizada.

Se você quiser uma página especializada para cada erro que você pode fazer algo como:

<system.web>    
   <customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
     <error statusCode="404" redirect="PageNotFound.aspx" />
   </customErrors>
</system.web>

E assim por diante.

Alternativamente, você pode editar o guia CustomErrors de suas propriedades do diretório virtual do IIS para apontar para o tratamento de erros páginas de escolha.

A descrição acima não parece trabalho para 401.x erros - este artigo-projeto de código explica uma solução alternativa para um que parece ser um problema muito semelhante: redirecionam para personalizado 401 página

Outras dicas

Infelizmente, você provavelmente vai exigir IIS7 e pegar este com um manipulador personalizado, desde IIS6 nunca vai chegar ao estágio em que podem ver o tamanho do arquivo. Ela só pode saber o tamanho quando ele é feito upload ou tem um erro.

Este é um problema conhecido no ASP.NET. Outro (lame) alternativa é lidar com isso no início do pedido e talvez usar um carregador baseado em flash. John links para vários no link abaixo .

Atualizar : Jon Galloway parecia ter olhou mais profundamente este problema e parece que a RIA-Uploader é a única alternativa sensata, uma vez que IIS parece sempre ter que engolir o arquivo e depois dizer-lhe que é a grande.

Sergei,

A resposta de Per JohnIdol, você precisa criar uma página de erro personalizada para o 413 statuscode. por exemplo:.

    <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
                    <error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
    </customErrors>

Eu sei porque eu tinha que resolver o mesmo problema em um projeto do cliente, e esta foi a solução que funcionou para mim. Infelizmente, foi a única solução que eu encontrei ... não era possível pegar este problema em particular em código; por exemplo, verificar o tamanho do arquivo postado como snomag sugeriu, ou pegar um erro no global.asax. Como você, eu também tinha tentado estas outras abordagens antes de eu vim com uma solução de trabalho. (Na verdade, eu finalmente encontrei isso em algum lugar na web, quando eu estava trabalhando no meu problema).

Espero que ajude.

Você deve ser capaz de capturar o erro no Global.asax - AoOcorrerErro manipulador (). Mas, infelizmente, o seu pedido inicial será concluída e você não será capaz de processar a mesma página de upload com alguma notificação de erro para o usuário.

O que você pode fazer, no máximo, é exibir uma página de erro amigável com cláusula de redirecionamento simples de dentro AoOcorrerErro () manipulador e nessa página para ter algum link ou funcionalidade semelhante para retornar o usuário para a página onde ele provocou o erro em primeiro lugar.

Update:

Eu tive que implementar verificação exata sobre upload de arquivos recentemente e que eu vim com é SWFUpload biblioteca que totalmente atendidas minhas necessidades e também tem um monte de recursos adicionais. Usei-o juntamente com invólucro jquery fornecido por Steve Sanderson. Mais detalhes podem ser encontrados aqui .

O ponto é, que o flash é capaz de detectar o tamanho do arquivo no lado do cliente e reagir adequadamente se este caso for atendida. E eu acho que isso é exatamente o que você precisa.

Ainda mais, você pode implementar verificação de detecção de flash, se você quiser degerade graciosamente para Button0 carregamento nativo no cliente caso não tem o Flash instalado.

A melhor maneira de lidar com grandes envios é usar uma solução que implementa um HttpModule que vai quebrar o arquivo em pedaços. Qualquer das soluções pré-lançada não deve permitir que você limitar o tamanho do arquivo. Muitos outros colocaram links para aqueles nesta página, para que eu não vai incomodar. No entanto, se você não quer se preocupar com que você pode lidar com isso no evento Global.asax Application_Error do seu aplicativo. Se sua aplicação for .NET 4.0, cole este bloco de código lá:

    if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
    }

Fonte: http://justinyue.wordpress.com/2010/10/29/handle-the-maximum-request-length-exceeded-error-for-asyncfileupload-control/

Se você estiver executando em um quadro antes, tente o código aqui (que é em VB, mas é fácil de traduzir): http://www.webdeveloper.com/forum/showthread.php?t=52132

Você pode verificar o comprimento do PostedFile (FileUpload.PostedFile.ContentLength), para ver se é abaixo do limite ou não e simplesmente mostrar uma mensagem de erro amigável, se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top