هل هناك "حالة سباق" محتملة عند استخدام ASP.NET MVC TempData عبر إعادة توجيه؟

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

سؤال

عند استخدام TempData ، أفهم أنه سيحتفظ بكل ما تضعه فيه لطلب واحد فقط. لذلك عند استخدام TempData للاحتفاظ بالبيانات عبر إعادة توجيه (من أجل استخدام نمط ما بعد الاسترداد) ، أليس من الممكن أن يأتي بعض الطلبات من المستخدم إلى الخادم بين الاستجابة التي ترسل إعادة التوجيه وإلى متصفح المستخدم يطلب الصفحة التي تم إعادة توجيهها؟ في هذه الحالة ، لم يعد الحصول على TempData متاحًا ، صحيح؟

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

تحرير: لكي أكون أكثر تحديدا بشأن السيناريو الذي كنت أسأل عنه.

  1. في علامة التبويب 1 ، يتصفح المستخدم إلى صفحة مع نموذج منشور
  2. في علامة التبويب 2 ، متصفحات المستخدم إلى صفحة أخرى على الموقع تقوم باسترجاعات AJAX على مؤقت
  3. في علامة التبويب 1 ، ينشر المستخدم النموذج إلى الخادم
  4. عندما يتلقى الخادم المنشور ، فإنه يحفظ بعض البيانات في TempData ويرسل استجابة إعادة التوجيه
  5. في Tab 2 ، يحدث رد اتصال Ajax المحدد ، وإرسال طلب الحصول على الخادم. تتم إزالة tempdata من الجلسة
  6. في علامة التبويب 1 ، يتلقى المتصفح إعادة التوجيه ويصدر طلب الحصول على طلب
  7. يقوم الخادم بمعالجة طلب الحصول على TempData ، لكنه لم يعد موجودًا
هل كانت مفيدة؟

المحلول

حسنًا ، يوضح تصفح رمز ASP.NET MVC أن TempData يتم تخزينه في الجلسة ، تتم إزالته من الجلسة عند تحميله. ويتم تحميله في طريقة وحدة التحكم التنفيذية ().

لذلك أعتقد أن هذا يعني أنه نعم ، يمكنك تمامًا أن تصادف حالة سباق حيث يمكن أن يتسبب طلب من علامة تبويب متصفح مختلفة (كان لديك مثال جيد جدًا) أن يتسبب في هذه المشكلة. ولكن هذا يعتمد على نموذج كل متصفح للتعامل مع الطلبات. قد يقوم المتصفح بتسلسل جميع الطلبات إلى نفس الخادم بحيث يتم تنفيذ واحد فقط في وقت واحد. في الواقع ، لن يفعلوا ذلك ، على الرغم من ذلك ، سيقومون بتثبيته في الحد الأقصى وهو (على ما أظن) 5 طلبات متزامنة لنفس الخادم.

بالنظر إلى أن موقع ASP.NET MVC يمكن أن يكون طلبات خدمات لأي متصفح (إنه الويب ، بعد كل شيء :)) إنه سيناريو حقيقي ، وإن كان من المحتمل أن يكون نادرًا ، كما قلت.

نصائح أخرى

من الممكن تمامًا أن يكون لديك حالة سباق عند استخدام TempData. ومع ذلك ، يجب أن تكون "سيئ الحظ" بالطبع لتجربة ذلك في ظل الاستخدام العادي. من أجل الصعود إلى حالة السباق ، يجب أن يكون الأمر صحيحًا:

  1. عليك أن تستخدم tempdata لتبدأ.
  2. يجب أن يكون لديك العديد من Windows/Tabs/Whatevers مفتوحة ومشاركة جلسة المتصفح نفسها.
  3. يجب على طلب من علامة تبويب المتصفح الثانية "التسلل" بين طلب واستجابة علامة التبويب المتصفح الأولى.

لاحظ أن البند رقم 2 يعتمد كثيرًا على المتصفح الذي تستخدمه. اعتمادًا على كيفية إعداد IE ، لمجرد أن لديك نوافذ متعددة لا يعني أنها تشترك في ملفات تعريف الارتباط للمتصفح ، وبالتالي فهي لا تشارك بالضرورة جلسات (والتي تستند إلى ملفات تعريف الارتباط).

ومع ذلك ، لا يوجد حالة سباق بمعنى أن شيئًا ما ينفجر إذا واجهته. قد يكون هذا ما يشير إليه. لكنك يستطيع اضغط على حالة السباق ، بمعنى أنك وضعت بعض TempData في طلب واحد ، ثم لم تعيدها في الطلب التالي أينما كنت يفكر كنت ستحصل عليه. سيكون مجرد فارغ.

شكرا ، إيلون

يستخدم TempData كائن الجلسة ، والذي لا يعاني من هذه المشكلة ، AFAIK. هل واجهت مشكلة محددة في هذا؟

أعتقد أنه لن يحدث أبدًا ، على الرغم من أن لدي نفس الالتباس. ستحصل على tempdate في إعادة توجيه ViewResult و The Other View ، ستجد أن الطلب الآخر لا يتم استجابته أبدًا حتى يتم الانتهاء من إجراء إعادة التوجيه. وماذا يعني؟ طلب واحد في وقت واحد. لذلك لا يمكن أن يحدث السيناريو أعلاه.

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