لماذا يقوم تطبيق asp.net الخاص بي بطرح ThreadAbortException؟

StackOverflow https://stackoverflow.com/questions/12476

  •  08-06-2019
  •  | 
  •  

سؤال

سؤال توضيحي ذاتي.

لماذا يظهر هذا الشيء في محاولتي حتى عندما لا يكون هناك أي خطأ؟

لماذا يظهر في سجلي مئات المرات؟

أعلم أنه سؤال جديد، ولكن إذا كان هذا الموقع سيحصل على تصنيف البحث ويجذب الجدد، فيجب علينا أن نطرحهم

هل كانت مفيدة؟

المحلول

من المحتمل أن يأتي هذا من استدعاء Response.Redirect.راجع هذا الرابط فيه شرح:

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(في معظم الحالات، يؤدي استدعاء Response.Redirect(url, false) إلى حل المشكلة)

نصائح أخرى

السبب الأكثر شيوعًا لـ ThreadAbortException هو الاتصال Response.End، أو Response.Redirect، أو Server.Transfer.قامت Microsoft بنشر بعض الوظائف المقترحة التي يجب استخدامها بدلاً من تلك الوظائف.

كما قال الآخرون، يحدث ذلك عند استدعاء Response.End() (والذي يحدث عند استدعاء Response.Redirect دون تمرير false كمعلمة ثانية).يعمل هذا كما تم تصميمها؛عادةً، إذا قمت بالاتصال بـ Response.Redirect، فأنت تريد أن تتم عملية إعادة التوجيه على الفور.شاهد هذا لمزيد من المعلومات:

Response.Redirect وThreadAbortException

مع العلم أن هناك (على الأقل) ثلاث واجهات برمجة تطبيقات تستخدم داخليًا Thread.Abort, ، أود الإجابة بعبارات أكثر عملية، حول كيفية معرفة ما يجب فعله حيال ذلك.

بالنسبة لنا، بدأ تسجيل هذا الخطأ فجأة.ما الذي تغير؟لقد أصلحنا خطأً في بعض إجراءات قاعدة البيانات التي كانت تتعامل مع ملفات Sitemap.

أظهرت سجلات log4net أن رأس X-Forwarded-For (نحن وراء NLB) كان عنوان IP الخاص بـ Googlebot، 66.249.78.x، وهو ما عزز نظريتي حول تغيير خريطة الموقع الذي أدى إلى زحف Google إلى موقعنا بشكل أكثر قوة بحثًا عن الصور.

كان أول شيء هو معرفة سبب تمكن Googlebot فقط من التسبب في هذه المشكلة.لم يكن هناك عميل آخر يقوم بتشغيل أي مسار تعليمات برمجية يستخدمه Response.Redirect, ، أو أيا كان.

لذلك في HttpApplication.Error المعالج، أضفت بعض التعليمات البرمجية لتسجيل مخرجات تفصيلية إضافية مع جميع الرؤوس ومعظم البيانات الموجودة في ملف HttpResponse و HttpContext انطلق لتسجيل الدخول.

هذا يتيح لي أن أرى أن المشكلة تكمن في أن Googlebot يستخدم سلسلة وكيل مستخدم iPhone ومسلحًا بذلك، وقد تمكنت من البحث في قاعدة التعليمات البرمجية لـ "iPhone" والتوصل إلى:

private void CheckIPhoneAccess() { ... }

وهذا يستخدم إعادة التوجيه.

ما يجب فعله حيال ذلك؟

حسنًا، بالنسبة لقاعدة التعليمات البرمجية القديمة هذه، لا يستحق الأمر إجراء تصحيح رجعي لجميع التعليمات البرمجية Response.Redirect المكالمات، لذلك سأقوم بخفض مستوى التسجيل لـ ThreadAbortException للتطبيق.

سوف أقوم بتغيير سلوك زاحف Googlebot للجوال، وهذا من شأنه لا يؤدي إلى "أكاذيب" حول ما يقدمه موقعنا للهواتف المحمولة لأنه يعيد التوجيه فقط عند النقرة الأولى، وبعد ذلك يقرأ ملف تعريف الارتباط ويعرض الصورة.يبدو أن Googlebot لا يقوم بتخزين ملف تعريف الارتباط هذا مؤقتًا.

إنه ليس مثاليًا، ولكن من المقرر إعادة بناء الموقع.ربما بواسطة فريق آخر يستخدم Scala أو شيء من هذا القبيل، لذلك من الناحية العملية، أعتقد أن هذا اختيار جيد.سأضيف تعليقات وقد أعود إلى المشكلة لاحقًا، وأنشئ ملفًا Response.SafeRedirect الامتداد الذي يتضمن هذه النصيحة:

لماذا تسبب Response.Redirect System.Threading.ThreadAbortException؟

لوقا

السبب وراء إعطاء Response.Redirect هذا الاستثناء هو قيام asp.net بتنفيذ واجهة برمجة التطبيقات هذه داخليًا باستخدام Thread.Abort().عندما يتم استدعاء هذه الطريقة، يتم طرح استثناء ThreadAbortException خاص. لن يتم ابتلاع هذا الاستثناء بواسطة أي كتلة التقاط.سيتم إعادة إلقائها في نهاية كل كتلة صيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top