Ce ar putea provoca ThreadAbortException când utilizați HttpWebRequest.GetResponse ()

Locuiesc în coșmaruri din cauza acestei situații, am un HttpWebRequest.GetResponse care continuă să-mi dea un ThreadAbortException, ceea ce face ca întreaga aplicație să scadă.

Cum pot să evit acest lucru sau, cel puțin, să mă descurc, ar fi util în acest caz utilizarea Thread.ResetAbort ()?

Pentru a explica mai multe aici este un exemplu de cod brut:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();

acum ultima linie de mai sus aruncă ThreadAbortException, ar putea fi din cauză că cererea a expirat ceea ce este bine, dar nu vreau să obțin un ThreadAbortException în aplicația mea ASP.NET 2.0 pentru că o omoară. ThreadAborException nu poate fi prins cu try/catch, singura modalitate de a se descurca este folosirea lui Thread.ResetAbort() care are si propriile sale efecte negative, va mentine threadul in viata si Dumnezeu stie doar pentru cat timp.

12
Încercați să prindeți un sistem.Excepție pe linia a doua și să vedeți ce tip de ex este aruncat.
adăugat autor StingyJack, sursa
Puteți să prindeți ThreadAbortException, trebuie doar să o gestionați corect. ResetAbort() este un lucru potrivit să faceți după ce ați terminat. Consultați msdn.microsoft.com/en-us/library/&hellip ; pentru mai multe.
adăugat autor Bob King, sursa

4 răspunsuri

Din ceea ce spuneți, se pare că faceți o trimitere WebRequest către o resursă externă din cadrul procesării unei cereri de intrare către o aplicație ASP.NET. Există (cel puțin) două termene limită care sunt relevante aici:

  • WebRequest.Timeout (implicit 100000ms = 100s) specifică intervalul de timp pentru executarea WebRequest-ului de ieșire. Dacă acest timp expiră, ar trebui să obțineți un WebException - deci nu este problema dvs.

  • HttpRuntime care procesează cererea de intrare are un timeout de execuție: valoarea implicită în conformitate cu MSDN este 110s pentru .NET 2.0 sau mai târziu, 90 de ani pentru .NET 1.x. Când expiră acest timp, veți primi un ThreadAbortException. Se pare că se întâmplă acest lucru.

In .NET 1.x, you'd expect this, because the default HttpRuntime executionTimeout is less than WebRequest.Timeout. In .NET 2.0, you'd expect this with the default timeouts if you have already spent >10s before making the outgoing WebRequest (e.g. if you have more than one outgoing WebRequest from within the same incoming request).

V-aș sugera fie:

  • Reduceți WebRequest.Timeout pentru cererile de ieșire și gestionați WebException sau

  • Dacă cererile de ieșire pot dura cu adevărat atât de mult, apoi măriți timpul de execuție al execuției httpRuntime așa cum este descris în MSDN .

12
adăugat
httpRuntime.executionTimeout a fost vinovatul în scenariul meu - mulțumesc!
adăugat autor RobSiklos, sursa

I had this problem with using Response. Check out this article for some workarounds. http://support.microsoft.com/kb/312629

De asemenea, aruncați o privire la această documentație MSDN în secțiunea pentru WebExcepție și Observații. http://msdn.microsoft.com/ro- ne/biblioteca/system.net.httpwebrequest.getresponse.aspx

Această excepție poate fi prinsă ... Dacă întâmpinați dificultăți în detectarea celei potrivite, ar trebui să încercați să obțineți o excepție generală (system.Exception) și de acolo urmărirea stivei ar trebui să vă spună tipul specific (HttpException, WebException, etc) de fapt captura.

2
adăugat

Aplicația noastră a aruncat tot timpul b/c lui ThreadAbortException Response.Redirect ("url") apeluri. Aplicația nu a fost închisă, cel mai probabil b/c excepția a fost prinsă la un moment dat și a rămas activă.

De altfel, Response.Redirect ("url", false) va împiedica încheierea răspunsului cu excepția. Postul lui Andrew trimite legături către soluții similare pentru diferite utilizări ale clasei de răspuns.

0
adăugat
Aceasta este exactă (răspunsul.Redirect (url) solicită răspunsul.End care aruncă un ThreadAbortException), dar nu este relevant pentru situația OP.
adăugat autor Joe, sursa

Am văzut ambele probleme enumerate de Andrew și "ForCripesSake".

O altă posibilitate pentru ThreadAbortException este orice cod care se execută în afara ciclului de viață al solicitării de pagină din partea serverului, cum ar fi HttpModules și HttpHandlers. Orice excepții aruncate într-un modul sau un handler nu merg la mecanismul implicit de excepție nestăvilit în ASP.Net și pot provoca moartea firului.

Există câteva excepții care nu pot fi gestionate cu ușurință în ASP.net sau CLR în general, în conformitate cu acest articol:

Cele mai bune practici de fiabilitate

Nu sunteți sigur dacă se aplică codului client pe care l-ați enumerat în întrebarea dvs., dar ar putea fi asociat.

Sper că vă ajută!

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com

PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT

SEO - optimizare, România & Moldova
SEO - optimizare, România & Moldova
120 participanți

Pentru confort, opriți notificările. Parteneri: ciupacabra.com Toate grupurile IT: @Grupuri_IT

Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.

DevOps - comunitatea Română
DevOps - comunitatea Română
100 participanți

Vorbim despre Kubernetes, CI/CD, Linux, docker, monitorizare, Cloud services, Prometheus, network și orice alte teme legate de administrarea serverelor.

Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md

iOS dezvoltatori, România — Moldova
iOS dezvoltatori, România — Moldova
21 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro, @seo_ro Android: @ro_android

.NET Romania
.NET Romania
20 participanți

Grup despre tehnologii Microsoft

MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.

PostgreSQL - comunitatea Română
PostgreSQL - comunitatea Română
5 participanți

Comunitatea română a programatorilor PostgreSQL.