2010-03-17 116 views
18

Ho lavorato allo sviluppo di un'applicazione di medio operatore, che carica il testo in un backend CMS utilizzando le richieste HTTP post per una serie di date (in genere 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.HttpWebRequest: la richiesta è stata interrotta: la richiesta è stata annullata

Ho cercato in giro e trovato le 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 stato troppo utile. 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.

Apprezzerei qualsiasi aiuto che posso ottenere in quanto questo è l'ultimo passaggio di un progetto a 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!

+0

Il collegamento pastebin è rotta. –

risposta

15

La soluzione comune elencata in 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 possibile soluzione che ho utilizzato quando ho riscontrato questo problema era 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 ...). È possibile 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.

3

Un breve riepilogo della mia domanda: Ho fino a 16 thread identici che eseguono 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... 
+1

Non si dovrebbe mai aver bisogno dello Sleep tra le chiamate. Se il timeout sulle richieste non è abbastanza grande (2000 in millisecondi è solo 2 secondi), dovresti ingrandirle, entro limiti ragionevoli. E fai attenzione al colpo di performance che puoi fare con KeepAlive = false che altri hanno menzionato se stai facendo un gran numero di chiamate HTTP. – MonkeyWrench

12

Qui è 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; 
+9

'Infinite' è piuttosto lungo. :) – dotNET

Problemi correlati