HttpWebRequest: la richiesta è stata interrotta: la richiesta è stata annullata

Ho lavorato allo sviluppo di un’applicazione di medie dimensioni, che carica il testo in un backend CMS utilizzando le richieste HTTP post per una serie di date (di solito 7 alla volta). Sto usando HttpWebRequest per realizzare questo. Sembra funzionare bene per la prima data, ma quando inizia la seconda data ottengo System.Net.WebException: la richiesta è stata interrotta: la richiesta è stata annullata.

Ho cercato in giro e ho trovato i seguenti grandi indizi:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/0d0afe40-c62a-4089-9d8b-fb4d206434dc

http://www.jaxidian.org/update/2007/05/05/8

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

E non sono stati troppo utili. Ho provato a sovraccaricare GetWebReuqest, ma questo non ha senso perché non faccio alcun uso di quella funzione.

Ecco il mio codice: http://pastebin.org/115268

Ottengo l’errore sulla linea 245 dopo che è stato eseguito correttamente almeno una volta.

Gradirei qualsiasi aiuto che posso ottenere in quanto questo è l’ultimo passo di un progetto su cui ho lavorato per qualche tempo. Questo è il mio primo progetto C # / VS, quindi sono aperto a tutti i suggerimenti, ma vorrei concentrarmi su come risolvere questo problema prima.

Grazie!

La soluzione comune elencata su Internet sembra essere quella di impostare la proprietà KeepAlive di HttpWebRequest su false. Questo può risolvere il problema se la causa principale è che si prevede che la connessione venga riutilizzata anche se in realtà è stata chiusa automaticamente dopo un certo periodo di tempo. Tuttavia, c’è un colpo di prestazioni per aprire e chiudere costantemente le connessioni.

Un’altra ansible soluzione che ho usato quando ho riscontrato questo problema era di estendere le proprietà di Timeout: WebRequest.ReadWriteTimeout, WebRequest.Timeout, RequestStream.WriteTimeout e RequestStream.ReadTimeout. Tieni presente che sono in millisecondi, quindi potresti desiderare che i timeout siano 1000 * 60 * 10 per rappresentare 10 minuti (o solo 600000 se pensi che saprai cosa significa …). È ansible verificare se questa è la causa più probabile del problema riducendo la dimensione del file.

BTW. Il tuo codice non era più sul sito web elencato. Potresti volerlo includere nel testo del tuo post se è ancora un problema.

Ecco l’unica soluzione funziona per me:

http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx

Queste linee sono la chiave:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(yourUri); wr.KeepAlive = false; wr.Timeout = System.Threading.Timeout.Infinite; wr.ProtocolVersion = HttpVersion.Version10; 

E qui:

 wr.AllowWriteStreamBuffering = false; 

Un breve riassunto della mia domanda: ho fino a 16 thread identici che fanno richieste HTTP simultanee. Ciascuno di questi thread richiede da diversi server Web insieme a endpoint locali unici. Ora la funzione che effettua queste chiamate ha 3 richieste HTTP successive da rendere (allo stesso server web) e fare qualche aggregazione.

Sulla base delle soluzioni pubblicate nei link sopra, la combinazione seguente ha funzionato per me.

 System.Net.ServicePointManager.DefaultConnectionLimit = 200; System.Net.ServicePointManager.MaxServicePointIdleTime = 2000; System.Net.ServicePointManager.MaxServicePoints = 1000; System.Net.ServicePointManager.SetTcpKeepAlive(false, 0, 0); HttpWebRequest webRequest1 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP + "/xslt?"); webRequest1.KeepAlive = false; webRequest1.Timeout = 2000; //Do other stuff here... //Close response stream Thread.Sleep(1000); //This delay seems to help. Obviously very specific to the server HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP + "/xslt?"); webRequest2.KeepAlive = false; webRequest2.Timeout = 2000; //Do other stuff here... //and so on...