هل هناك شيء يمنع Response.Redirect لعمل داخل كتلة حاول اللحاق؟

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

سؤال

وحصلت على بعض خطأ غريب مع response.redirect() وكان المشروع ليس بناء على الإطلاق .. عندما أزلت <م> محاولة اللحاق الكتلة التي كانت تحيط كتلة من التعليمات البرمجية حيث كان Response.Redirect() في أنها عملت بشكل طبيعي ..

ونريد فقط أن نعرف إذا كانت هذه هي مشكلة معروفة أو شيء من هذا ...

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

المحلول

إذا كنت أتذكر بشكل صحيح، Response.Redirect() يطرح استثناء لإجهاض الطلب الحالي (ThreadAbortedException أو شيء من هذا القبيل). لذلك قد يكون اصطياد هذا الاستثناء.

وتحرير:

KB المقالة يصف هذا السلوك (أيضا لأساليب Request.End() وServer.Transfer()).

لResponse.Redirect() يوجد الزائد:

Response.Redirect(String url, bool endResponse)

إذا كنت تمر endResponse=false، ثم استثناء لا ألقيت (ولكن سيستمر وقت معالجة الطلب الحالي).

إذا endResponse=true (أو إذا تم استخدام الزائد أخرى)، يتم طرح استثناء وسوف يتسن على الفور إنهاء الطلب الحالي.

نصائح أخرى

وكما يشير مارتن خارجا، Response.Redirect يلقي ThreadAbortException. الحل هو إعادة رمي استثناء:

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}

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

وكنت قد المشار متغير الذي أعلن داخل كتلة المحاولة.

وعلى سبيل المثال، رمز أدناه غير صالح:

try
{
  var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}

ويجب الخروج الإعلان ب إلى خارج الكتلة محاولة اللحاق.

var b = false;
try
{
  b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}

وأنا لا أعتقد أن هناك أي مشكلة معروفة هنا.

وأنت ببساطة لا تستطيع أن تفعل إعادة توجيه () داخل كتلة حاول / catch لإعادة توجيه يترك الرقابة الحالية ل.aspx اتصال أخرى (على سبيل المثال)، مما يترك الصيد في الهواء (لا يمكن العودة إليها) .

وتحرير: من ناحية أخرى، وأنا ربما كان كل هذا برزت إلى الوراء. عذرا.

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