« Static classes in C# and Java | Bing app with Navigation for Windows Mobile released! » |
HttpWebRequest.Abort() in .NET Compact Framework 2 doesn't work when m_connection is null
Wednesday, March 31, 2010
Note: This post applies to CF 2.0 and below. It is fixed in later versions.
I literally spent days poring over our app's code to figure out what was going wrong. Eventually I gave up and blamed our failure on the Compact Framework code, and it seems I was correct. It appears that in CF 2.0, HttpWebRequest.Abort()
is broken in some cases and causes very difficult-to-detect incorrectness in subsequent requests.
Create and send an HttpWebRequest
:
HttpWebRequest r = (HttpWebRequest)WebRequest.Create("http://www.example.com/"); r.BeginGetResponse(new AsyncCallback(SomeFunction), null);
Now, sometime later but before the request is completed, try to abort the request:
r.Abort();
It's obvious what this code is supposed to do, and the API also clearly states what is supposed to happen — the request is cancelled. However, due to a CF bug, that doesn't always work correctly.
If you Abort()
the request early enough, it is possible that the m_connection
private member of the HttpWebRequest
object has not been set. In this case, the Abort()
call actually fails to abort the connection. In fact, the HttpWebRequest
will appear to have been aborted, but its underlying Connection
object (and its Socket
object) will still be sitting around. Since the Connection
objects used by HttpWebRequest
are pooled, this is very bad. It leaves the Connection
object in an unaborted state while its owning HttpWebRequest
has been aborted — meaning when the Connection
object is reused by a different request, it still has old state and will behave in unexpected ways.
Consider the following scenario:
- Client creates a new
HttpWebRequest
and begins a request for HTTP resource A. - Someone calls
Abort()
on that request beforem_connection
is set. - Abort will silently fail and the underlying
Connection
andSocket
will be left in an invalid state. - Client creates a new
HttpWebRequest
and begins a request for HTTP resource B. - Since
HttpWebRequest
s are not pooled,HttpWebRequest
B is a different object from the now-defunctHttpWebRequest
A. However, their underlyingConnection
objects are pooled.HttpWebRequest
B tries to get aConnection
from the pool, and may end up with theConnection
that A left in an invalid state. HttpWebRequest
B sends things through its underlyingConnection
and theSocket
owned by theConnection
. But theSocket
is still connected to resource A.HttpWebRequest
B thinks it successfully sent request B. The server returns content from A since that's what theSocket
's associated with.HttpWebRequest
B gets a response stream from the server. It thinks that this contains data from resource B, when in fact it is data from resource A.
So you end up with random data corruption. Not only that, but it's silent: it's very difficult to detect this condition, and most of the time the data looks legitimate. For example if you're downloading 100 images and image #50 actually contains the data that was supposed to go into image #49, well, tough luck because it looks like a legitimate image.
I spent forever trying to come up with solutions to this, but could only come up with ones that don't work:
Do not call
Abort()
onHttpWebRequest
s whosem_connection
member is null.Since this bug occurs iff
m_connection == null
when aborting, if we avoid doing that then this bug can never occur. The problem is thatAbort()
is the only way to kill the request, and it may not be possible for your app to completely avoid aborting requests. In addition, since theConnection
objects are pooled and there are very few of them in the pool, you can't leave these requests hanging around or your app will quickly run out of connections. (IfAbort()
is called and this bug is triggered, theConnection
will be returned to the pool and not block subsequent requests; it will just have unpredictable behavior next time.)When aborting, check
m_connection
, and if it's null then store theConnection
which is about to become invalid into a data structure somewhere. When anHttpWebRequest
returns data, check to see whether it came from a brokenConnection
; if so disregard the data and retry.This would work... if it was possible to get the
HttpWebRequest
'sConnection
object. But since the bug only occurs whenm_connection == null
, and because theConnection
is actually created deep within the innards of the code, passed around as a local variable, and is not known to theHttpWebRequest
until a callback some time later, it's not possible at abort time to get a reference to theConnection
object, not even with reflection.Also, since the
HttpWebRequest
aren't pooled, keeping track of those is not useful.Inherit from
HttpWebRequest
. Tag each one with a unique ID, and when the response comes back check to see the ID is what you expectSince
HttpWebRequest
s aren't pooled this doesn't work. It's the underlyingConnection
which is pooled and left in an invalid state, not the request itself.Set a timeout on the underlying
Connection
or theSocket
that it owns so they can dispose themselves.Those two objects don't have such a thing as timeouts, at least not in CF, and even if they did there's no way to get a reference to those objects until
m_connection
is set (but the bug is gone by that point).HttpWebRequest
has a timeout but it is useless as it simply callsAbort()
when the timer rings, so will still exhibit the buggy behavior.
The fix is to use CF 3.5, but I have to support 2.0. Still looking for a workaround...
Comments
Mark Zepeda on Sunday, April 21, 2024 at 01:13
Advantages of hiring a Developer:
Specialized Expertise
Tailored Customization and Control
Time and Cost Efficiency
Custom Plugin Development
SEO Optimization
Ongoing Support and Maintenance
Seamless Integration and Migration
Scalability for Business Growth
Hire a web developer now from us. Contact us at https://wpexpertspro.co/website/?src=a21dzhang.com
Michaelrooke on Sunday, April 21, 2024 at 03:07
with escort girls is save, adoring and unforgettable! These girls make life of men happier Ely is a small city in sex, pleasure and relaxation. However, going to meet this girl, never forget that she also needs respect and polite treatment. <a href=http://escortslove.top/>escort in west london</a>
Brianciz on Sunday, April 21, 2024 at 16:34
сео продвижение сайтов частником <a href=https://seo-goody.ru/>https://seo-goody.ru/</a>
Michaeldib on Monday, April 22, 2024 at 03:55
<a href=https://bolnichniy-24.info/>купить электронный больничный лист</a>
Ricardodip on Tuesday, April 23, 2024 at 00:03
אירוטי בחיפה, באזור הקריות והצפון במהלך חופשה באזור הצפון. מומלץ להזמין נערות ליווי בצפון גם לאירועים שאתם עורכים: ימי נישואין, ימי הולדת, וכד להזמין שירותי ליווי לביתך מלון באזור הצפון נערות ליווי בצפון מספקות גירוי וחשק ברמות שלא הכרתם. האנרגיות <a href=http://mapitom.top/>הזמנות נערות ליווי בשילוב מין וטכנולוגיה</a>
DavidnuM on Tuesday, April 23, 2024 at 01:07
ובמרחק שנות אור מכל האחרים דירות דיסקרטיות בדרום מבחינת איכות גימור והיגיינה, אין כל הבדל בין דירות דיסקרטיות בדרום לדירות דיסקרטיות באזור תל אביב או המרכז, כאשר מגיעים לדירות הנכונות כמובן. הדבר הראשון שעלייך לשאול את עצמך הוא מה תכלול החוויה המושלמת <a href=http://mazula.top/>נערת ליווי בתל אביב – האם חווית פעם עונג צרוף?</a>
AlfredoOrete on Tuesday, April 23, 2024 at 01:51
להשתחרר ולהיות עצמך, בלי מסכות ובלי עכבות נערות ליווי לבילוי חדשות צעירות ויפות ניתן לומר כי ישנה יותר מהמלצה אחת. ראשית כל, מומלץ לברר אלו שירותי נערת ליווי בדיוק ניתנים על ידי שירותי נערות ליווי. בליאור סקס, ניתן למצוא מודעות המפרטות בחלקן מהם אותם <a href=http://mebelon.top/>Order erotic massage Tel Aviv services to get divine pleasure</a>
GeorgeCag on Tuesday, April 23, 2024 at 21:55
והמטפלים המקצועיים שכל אחת מהן מציעה ולבחור. בין אם מדובר במעסות מקצועיות אשר יעבירו לך מגוון עיסויים שישחררו כל חלק ממך, טיפולי ספא מפנקים עם שמנים ונרות ריחניים או מופע חשפניות מעורר, דירה דיסקרטית היא התפאורה והכיסוי המושלם עבור כל חוויה שירות בדירה <a href=http://naron.top/>מה שעושים עם בחורה של דירת פינוק נשאר שם</a>
Erickmah on Wednesday, April 24, 2024 at 09:21
הבילוי עם נערות הליווי מתאים לכולם. זהו רעיון מעולה למסיבת רווקים, מסיבת גיוס, מסיבת שחרור או סתם כאשר רוצים לחגוג את החופש ואת החיים הטובים. זה בילוי כאשר אתם מרגישים בודדים, או כאשר אתם רוצים קצת לשכוח הכל ופשוט ליהנות בצורה הטבעית ביותר. הנערות זורמות <a href=http://suliko.top/>דירות סקס בקריות</a>
BernieBic on Wednesday, April 24, 2024 at 10:17
לאדירה, בין אם מדובר בפרטיות, מרחב, חשפניות, עיסוי אירוטי בדרום או כל אטרקציה אחרת. הדירה המושלמת לצרכים שלך כבר מוכנה, כל שעליך לעשות הוא למצוא אותה מבין מגוון דירות דיסקרטי דרום הקיימות באתר – ולפנות ישירות למפרסמים איפה יש דירות דיסקרטיות? כיום ניתן <a href=http://fasadon.top/>סקס בדרום תל אביב</a>
Depinder Bharti on Sunday, April 25, 2010 at 11:40
Exactly, The reason how i came here is i was also facing the same problem and not able to understood what is happening and where i am going wrong.
In my case when i aborted, from application side it shows its aborted also application sometimes hangs, but in actual the request was still receiving data and it only stops after completing.