httpwebrequest غير المتزامن وكائن httpcontext.current.response/طلب
-
20-09-2019 - |
سؤال
لدي تطبيق ويب يعتمد بشكل كبير على خدمات الويب. يتم كل شيء مع الخدمات بشكل غير متزامن ومع addonPrereQuestHandLerexecuteAsync. على أي حال ، تعمل معظم مكالماتي بشكل جيد ، لكن بعضها يعود من مكالمات الخدمة غير المتزامنة للعثور على كائن httpcontext.current.current.response/الطلب في EndPrereQuest ، وهو بالطبع أخطاء في اللحظة التي أحاول استخدامها أيضًا. كلا الكائنين (الاستجابة والطلب متاح/لا ، لاغية على BeginPrerequest من المكالمات الفاشلة والعمل في endprerequest للمكالمات الأخرى).
أي شخص يركض إلى مشابه ، أو لديه تخمين لما قد يكون المشكلة؟
تحديث: يبدو أنه قد وجد حلاً ، إذا قمت بإنشاء متغير لـ httpapplication على init (من httpmodule ، يحدث كل ذلك في) يمكن الوصول إلى httpcontext من هذا المتغير.
تحديث: تمرير إما httpapplication أو httpcontext.current على وظيفة البداية له نفس المشكلة. عند تمريرها كجزء من "حالة" المكالمة غير المتزامنة ، ينتهي بهم المطاف في وظيفة النهاية ، على الرغم من أنها صالحة في وظيفة البداية.
تحديث: لقد أضفت بعض التسجيل ووجدت أن المكالمة غير المتزامنة التي أجريها تعود بشكل صحيح ، والنتائج موجودة ، يتم استدعاء وظيفة رد الاتصال بشكل صحيح.
المحلول 2
يبدو أنه قد وجدت حلاً ، إذا قمت بإنشاء متغير لـ httpapplication على init (من httpmodule ، يحدث كل هذا في) يمكن الوصول إلى HTTPContext من هذا المتغير.
نصائح أخرى
أظن أنني أعلم أن المشكلة التي تواجهها. الجواب ، بالتأكيد ، هو استبدال استخدام HttpWebRequest
مع WebClient
, ، واستخدام أساليب *async من WebClient
.
إليك التفسير الطويل: هناك نموذجان مختلفان لبرمجة Async: IaSyncresult Async نمط و ال نمط غير متزامن قائم على الحدث. يستخدم نمط iAsyncresult BeginXXX
و EndXXX
الأساليب ، يستخدم مثيلات IASYNCRESULT ، ويستخدم المندوبين لعمليات الاسترجاعات ، ويدعم في انتظار الانتهاء. يستخدم النمط المستند إلى الحدث طرق XXXASYNC لبدء إجراءات ASYNC ، ويستخدمها XXXCompleted
الأحداث بدلاً من عمليات الاسترجاعات للتعامل مع الإكمال ، و (هذا مهم لحالتك) ينقل السياق المحدد للمعالج إلى كل معالج أحداث رد الاتصال.
بمعنى آخر ، إذا وضعت رمز رد الاتصال الخاص بك داخل معالج الأحداث XXXCOMPLETED (مثل WebClient.DownloadStringCompleted
) ، ثم سيتم ملء httpcontext.current بشكل صحيح.
ومع ذلك ، إذا كنت تستخدم طريقة beginxxx (مثل HttpWebRequest.BeginGetResponse
) ورد اتصال مندوب ، سيتم تنفيذ رد الاتصال الخاص بك في سياق مؤشر ترابط لا يضمن أن يكون سياق ASP.NET الصحيح المرفق.
بشكل عام ، تستخدم فئات مكتبة Framework. NET نمطًا غير متزامن أو آخر. عادة ، الفئات ذات المستوى الأدنى (على سبيل المثال HttpWebRequest
) سوف تستخدم نمط iaSyncresult ، في حين أن الفئات ذات المستوى الأعلى (على سبيل المثال WebClient
) سوف تستخدم النمط القائم على الحدث. ستدعم بعض فصول Oddball (على سبيل المثال الوكلاء عن بعد .NET الذي تم إنشاؤه تلقائيًا) كلا الأنماط ، لكن هذا أمر نادر.
لذلك ، إذا كان من السهل القيام بذلك ، أقترح الانتقال إلى معالجات WebClient ومعالجات الأحداث بدلاً من HTTPWebRequest ومندوبي رد الاتصال. هذا يجب ان يحل مشكلتك. إذا كان التبديل إلى WebClient صعبًا للغاية ، فربما يمكنني اقتراح بعض البدائل الغامضة.