Sanando o "The request was aborted: The request was canceled." no upload

Nome do post meio estranho, mas vamos lá!
Esses dias, fazendo um uploadzinho maroto, o cliente precisou enviar um arquivo "grande" só que na hospedagem dele, mesmo adicionando os parâmetros de configuração no web.config como executionTimeoutmaxRequestLengthmaxAllowedContentLength, etc, continuava o erro. Dando uma vasculhada na net algumas pessoas resolveram colocando o KeepAlive como false mas eu estava usando o WebClient que não tem o atributo e não queria reprogramar o que já havia feito. Eis que encontro uma solução que caiu como uma luva mesmo não usando o atributo.
Adicione ao projeto a classe ExtendedWebClient conforme o código abaixo:

public class ExtendedWebClient : WebClient
{
    public int Timeout { get; set; }
    public new bool AllowWriteStreamBuffering { get; set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = Timeout;
            var httpRequest = request as HttpWebRequest;
            if (httpRequest != null)
            {
                httpRequest.AllowWriteStreamBuffering = AllowWriteStreamBuffering;
            }
        }
        return request;
    }

    public ExtendedWebClient()
    {
        Timeout = 100000;
    }
}

Então, agora é apenas substituir o WebClient por ExtendedWebClient ficando assim:

ExtendedWebClient ftp = new ExtendedWebClient();
ftp.Timeout = Timeout.Infinite;
ftp.AllowWriteStreamBuffering = false;

E o resto segue! 
Pode utilizar o KeepAlive? Pode! Basta fazer da mesma forma que o AllowWriteStreamBuffering.

0 comentários:

Postar um comentário