سؤال

لدي تطبيق ويب يعتمد بشكل كبير على خدمات الويب. يتم كل شيء مع الخدمات بشكل غير متزامن ومع 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 صعبًا للغاية ، فربما يمكنني اقتراح بعض البدائل الغامضة.

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