Domanda

Sto provando a caricare file su un server Web usando System.Net.WebClient.UploadFile ma continuo a ricevere una WebException. In particolare, sto ricevendo 3 errori. Non ho idea del perché non ricevo lo stesso errore, ma sembrano tutti correlati in base a ciò che ho trovato online.

  • La richiesta è stata interrotta: la richiesta è stata annullata.
  • Connessione chiusa. Riprova.
  • Una connessione esistente è stata forzatamente chiusa dall'host remoto.

Sembra in qualche modo casuale (non sempre lo stesso file, la quantità di tempo o qualsiasi altro modello che riesco a capire). Inoltre, ciò non accade sulla mia rete di lavoro (i caricamenti richiedono meno di 2 secondi), ma avviene da casa tramite un DSL (i caricamenti impiegano circa 2 minuti).

Da quello che ho trovato online, questi errori hanno qualcosa a che fare con i keep-alive. Sfortunatamente WebClient non fornisce alcun modo per disattivarli (non sono sicuro che lo vorrei comunque poiché si tratta di una funzione di prestazione).

Penso che potrebbe avere qualcosa a che fare con i timeout, ma non riesco a capire perché. Il server è ASP.Net MVC e il timeout è impostato su un'ora.

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

Sono interessato in entrambi i modi per risolvere questo problema in modo che non accada e anche le tecniche di recupero (semplicemente fare di nuovo la richiesta non sembra essere efficace).

Qualche sfondo, questo è per un'applicazione WinForms che carica le foto sul server. Il server è un'applicazione ASP.Net MVC. Il client ha funzionato correttamente per molto tempo ma ora non riesce da quando l'ho passato ad ASP.Net MVC (stava usando ASP classico con FileUp SA). Il lato client è cambiato solo per accogliere i nuovi URL, a parte il fatto che è praticamente lo stesso.

È stato utile?

Soluzione

L'eccezione " La richiesta è stata interrotta: la richiesta è stata annullata. " viene generato se WebClient scade durante un trasferimento di file. Se non viene eseguito alcun trasferimento di file, otterrai "quotazione scaduta". anziché.

Il timeout si sta verificando sul client. WebClient non consente di impostare il timeout e il valore predefinito per HttpWebRequest (che utilizza WebClient) è 100 secondi. Immagino che dovrò capire come ottenere progressi quando si utilizza HttpWebRequest. Dovrò anche capire perché il trasferimento di file ASP.Net è più lento rispetto all'utilizzo di SAFileUp con ASP classico.

AGGIORNAMENTO: ho creato una classe WebHelper che sostituisce WebClient ma fornisce un maggiore accesso alle funzionalità necessarie del WebRequest sottostante. Fornisce inoltre una serie di funzionalità aggiuntive su WebClient. Se sei interessato, è disponibile nel progetto BizArk su CodePlex.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top