Pergunta

Eu estou tentando fazer upload de arquivos para um servidor web usando System.Net.WebClient.UploadFile mas eu continuo recebendo um WebException. Especificamente, eu estou recebendo 3 erros. Eu não tenho idéia por que eu não estou recebendo o mesmo erro, mas todos eles parecem estar relacionados com base no que eu encontrei on-line.

  • A solicitação foi anulada:. O pedido foi cancelado
  • Conexão fechada. Tente novamente.
  • Uma conexão existente forçosamente foi fechada pelo host remoto.

Parece um pouco aleatório (nem sempre o mesmo arquivo, período de tempo, ou qualquer outro padrão que eu possa descobrir). Também este não acontece na minha rede de trabalho (os envios levar menos de 2 segundos), mas acontece a partir de casa através de uma DSL (os envios levar cerca de 2 minutos).

Desde que eu encontrei on-line, esses erros têm algo a ver com keep-alives. Infelizmente WebClient não fornece nenhuma maneira de transformar estes off (não tenho certeza se eu iria querer de qualquer maneira uma vez que esta é uma característica de desempenho).

Eu acho que pode ter algo a ver com o tempo limite, mas eu não consigo descobrir o porquê. O servidor é ASP.Net MVC e o tempo limite é definido para uma hora.

    <httpRuntime
        maxRequestLength="10024" 
        executionTimeout="3600"
        /><!-- 10024 = 10MB, 3600 = 1hr -->

Estou interessado em ambas as formas de corrigir esse problema para que isso não aconteça e também técnicas de recuperação (basta fazer o pedido novamente não parece ser eficaz).

Alguns fundo, isto é para um aplicativo WinForms que faz upload de fotos para o servidor. O servidor é uma aplicação ASP.Net MVC. O cliente tem trabalhado corretamente por um longo tempo, mas agora está falhando desde I transferido para ASP.Net MVC (ele estava usando ASP clássico com SA FileUp). O lado do cliente só mudou para acomodar os novos URLs, para além de que é praticamente o mesmo.

Foi útil?

Solução

A exceção "A solicitação foi anulada: A solicitação foi cancelada." é lançada se os tempos WebClient durante uma transferência de arquivo. Se não houver transferência de arquivos está ocorrendo, você receberá "A operação expirou" em vez.

O tempo limite está ocorrendo no cliente. WebClient não permite que você defina o tempo limite e o padrão para HttpWebRequest (o que webclient usos) é de 100 segundos. Acho que vou ter que descobrir como obter o progresso quando usando HttpWebRequest. Eu também terá que descobrir por transferência de arquivo ASP.Net é mais lento do que usar SAFileUp com o ASP clássico.

UPDATE: Eu criei uma classe WebHelper que toma o lugar do WebClient, mas fornece mais acesso aos recursos necessários do subjacente WebRequest. Ele também fornece um monte de recursos adicionais sobre o WebClient. Se você estiver interessado, ele está disponível na BizArk projeto no CodePlex.

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