سؤال

ما هو الفرق بين Server.Transfer و Response.Redirect?

  • ما هي مزايا وعيوب كل منها ؟
  • عندما واحد هو مناسبة أكثر من غيرها ؟
  • عند واحد غير المناسب ؟
هل كانت مفيدة؟

المحلول

Response.Redirect ببساطة يرسل رسالة (HTTP 302) وصولا إلى المتصفح.

Server.Transfer يحدث دون المتصفح معرفة أي شيء ، المستعرض طلب صفحة ولكن الملقم بإرجاع محتوى آخر.

نصائح أخرى

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

Server.Transfer() لا تغيير شريط العنوان.لا يمكنك ضرب مرة أخرى.

يمكنني استخدام Server.Transfer() عندما لا تريد المستخدم أن ترى أين أنا ذاهب.في بعض الأحيان على "تحميل" نوع الصفحة.

وإلا سوف دائما استخدام Response.Redirect().

أن تكون قصيرة: Response.Redirect ببساطة يحكي المتصفح لزيارة صفحة أخرى. Server.Transfer يساعد في تقليل طلبات الخادم ، يبقى URL نفسه ، مع القليل من الشوائب تقريع, يسمح لك بنقل سلسلة الاستعلام و شكل المتغيرات.

لقد وجدت شيئا و أتفق مع (المصدر):

Server.Transfer يشبه في ذلك يرسل المستخدم إلى صفحة أخرى مع بيان مثل Server.Transfer("WebForm2.aspx").ومع ذلك ، بيان لديها عدد من مزايا وعيوب.

أولا: تحويل إلى صفحة أخرى باستخدام Server.Transfer يحافظ على موارد الخادم.بدلا من أن تقول المتصفح إعادة توجيه, ببساطة التغييرات "التركيز" على ملقم ويب ، نقل الطلب.هذا يعني أنك لا تحصل تماما كما العديد من HTTP الطلبات القادمة من خلال وبالتالي يخفف الضغط على الخاص خادم الويب و يجعل التطبيقات الخاصة بك تشغيل أسرع.

ولكن احترس:لأن "نقل" العملية يمكن أن تعمل على هؤلاء فقط المواقع قيد التشغيل على الخادم ؛ لا يمكنك استخدام Server.Transfer إرسال المستخدم إلى موقع خارجي.فقط Response.Redirect يمكن أن نفعل ذلك.

ثانيا ، Server.Transfer يحافظ الأصلي URL في المتصفح.هذا يمكن أن تساعد حقا تبسيط إدخال البيانات التقنيات ، على الرغم من أنه قد جعل الارتباك عند التصحيح.

هذا ليس كل شيء:على Server.Transfer الطريقة أيضا لديه الثانية المعلمة—"preserveForm".إذا قمت بتعيين هذا إلى True, باستخدام بيان مثل Server.Transfer("WebForm2.aspx", True), القائمة استعلام سلسلة وأي شكل من المتغيرات سوف لا يزال تكون متاحة على الصفحة المحول إليها.

على سبيل المثال, إذا كان لديك WebForm1.aspx يحتوي على عنصر تحكم مربع نص يسمى TextBox1 و نقلها إلى WebForm2.aspx مع preserveForm المعلمة تعيين إلى True ستكون قادرة على استرداد قيمة الصفحة الأصلية تحكم مربع نص عن طريق الرجوع Request.Form("TextBox1").

Response.Redirect() ينبغي أن تستخدم عند:

  • نريد توجيه الطلب إلى بعض صفحات HTML واضحة على الخادم لدينا ، أو إلى ملقم ويب
  • نحن لا نهتم تسبب إضافية roundtrips إلى الخادم على كل طلب
  • لا نحتاج إلى الحفاظ على سلسلة الاستعلام و شكل متغيرات من الطلب الأصلي
  • نحن نريد المستخدمين أن تكون قادرا على رؤية جديدة إعادة توجيه عنوان URL حيث كان يتم إعادة توجيه في المتصفح (و تكون قادرة على المرجعية إذا لزم الأمر)

Server.Transfer() ينبغي أن تستخدم عند:

  • نريد نقل الصفحة الحالية من طلب إلى آخر .صفحة aspx على نفس الخادم
  • نحن نريد الحفاظ على موارد الخادم و تجنب لا لزوم لها roundtrips إلى الملقم
  • نحن نريد الحفاظ على سلسلة الاستعلام و شكل متغيرات (اختياريا)
  • نحن لا نحتاج إلى إظهار الحقيقي URL حيث أننا توجيه طلب في مستخدمي متصفح الويب

استجابة.إعادة توجيه إعادة توجيه الصفحة إلى صفحة أخرى بعد الصفحة الأولى يصل إلى العميل.حتى يعرف العميل إعادة توجيه.

الملقم.نقل إنهاء التنفيذ الحالي من الصفحة.العميل لا يعرف إعادة التوجيه.انها تسمح لك لنقل سلسلة الاستعلام و شكل المتغيرات.

لذا فإنه يعتمد على الاحتياجات الخاصة بك لاختيار الأفضل.

enter image description here

"استجابة.إعادة توجيه" و "الملقم.نقل" يساعد على نقل المستخدم من صفحة إلى صفحة أخرى في حين أن صفحة المنفذة.ولكن الطريقة التي تفعل هذا النقل / إعادة توجيه هو مختلف جدا.

في حال كنت البصرية الرجل يود رؤية مظاهرة بدلا من نظرية أود أن أقترح أن ترى أدناه facebook الفيديو الذي يوضح الفرق في طريقة برهانية.

https://www.facebook.com/photo.php?v=762186150488997

الفرق الرئيسي بينهما هو الذي لا نقل.في "الاستجابة.إعادة توجيه" يتم النقل من قبل المتصفح. في "الملقم.نقل" انها فعلت من قبل الملقم.دعونا نحاول أن نفهم هذه العبارة في أكثر تفاصيل الطريقة.

في "الملقم.نقل" التالي هو تسلسل كيف يحدث نقل:-

1.المستخدم يرسل الطلب إلى ASP.NET الصفحة.في الشكل أدناه يتم إرسال الطلب إلى "WebForm1" ونود أن انتقل إلى "Webform2".

2.خادم يبدأ تنفيذ "Webform1" و دورة حياة تبدأ الصفحة.ولكن قبل استكمال دورة حياة الصفحة إكمال "الملقم.نقل" يحدث "WebForm2".

3."Webform2" صفحة يتم إنشاء كائن كامل دورة حياة الصفحة يتم تنفيذ و إخراج HTML استجابة ثم يتم إرسالها إلى المستعرض.

enter image description here

بينما في "الاستجابة.إعادة توجيه" التالي هو تسلسل الأحداث للملاحة:-

1.العميل (المستعرض) يرسل الطلب إلى الصفحة.في الشكل أدناه يتم إرسال الطلب إلى "WebForm1" ونود أن انتقل إلى "Webform2".

2.دورة حياة "Webform1" يبدأ تنفيذ.ولكن في ما بين دورة الحياة "ردا على ذلك.إعادة توجيه" يحدث.

3.الآن بدلا من الخادم القيام توجيه إنه يرسل HTTP 302 الأمر إلى المتصفح.هذا الأمر يخبر المتصفح بأن عليه أن يبادر على طلب "Webform2.aspx" صفحة.

4.المتصفح يفسر 302 قيادة يرسل على طلب "Webform2.aspx".

enter image description here

وبعبارة أخرى "الملقم.نقل" يتم تنفيذه من قبل الملقم في حين أن "الاستجابة.إعادة توجيه" يتم تنفيذه من قبل thr المتصفح."استجابة.إعادة توجيه" يحتاج إلى اثنين إلى إعادة توجيه الصفحة.

حتى عند استخدام "الملقم.نقل" إلى "الاستجابة.إعادة توجيه" ?

استخدام "الملقم.نقل" عندما تريد التنقل بين الصفحات التي تتواجد على نفس الملقم استخدام "استجابة.إعادة توجيه" عندما تريد التنقل بين الصفحات التي تتواجد على مختلف خادم المجال.

enter image description here

فيما يلي ملخص الجدول الذي طباشير الخلافات في السيناريو الذي للاستخدام.

enter image description here

جمال الخادم.نقل ما يمكنك القيام به معه:

TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");

يمكنك الحصول على أي شيء من الصفحة السابقة باستخدام الأسلوب أعلاه طالما كنت تستخدم الملقم.نقل ولكن لا استجابة.إعادة توجيه

بالإضافة إلى ScarletGarden تعليق, تحتاج أيضا إلى النظر في تأثير محركات البحث الخاصة بك إعادة توجيه.لديه هذه الصفحة انتقلت بشكل دائم ؟ ومؤقتا ؟ فإنه يجعل الفرق.

انظر: استجابة.توجيه مقابل"301 انتقلت بشكل دائم":

لقد استخدموا كل استجابة.إعادة توجيه في وقت واحد أو آخر.انها سريعة و طريقة سهلة للحصول على الزوار إلى في الاتجاه الصحيح إذا كانوا بطريقة أو بأخرى في نهاية المطاف في المكان الخطأ.ولكن هل أعرف أن الرد.توجيه يرسل استجابة HTTP رمز حالة من "302 وجدت" عندما كنت قد تريد حقا أن إرسال "301 انتقلت بشكل دائم"?

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

نقل تماما من جانب الخادم.العميل شريط العنوان يبقى ثابتا.بعض التعقيد عن نقل السياق بين الطلبات.التنظيف وإعادة تشغيل صفحة معالجات يمكن أن تكون مكلفة حتى تفعل نقل في وقت مبكر في خط أنابيب مثلافي HttpModule خلال BeginRequest.قراءة MSDN مستندات بعناية و اختبار و فهم القيم الجديدة من HttpContext.طلب - وخاصة في إعادة النشر السيناريوهات.ونحن عادة استخدام الملقم.نقل عن خطأ السيناريوهات.

توجيه إنهاء الطلب مع 302 حالة العميل ذهاب وإياب الرد و داخليا يأكل استثناء (قاصر خادم perf ضرب - يعتمد كم كنت تفعل يوم) العميل ثم يتنقل إلى العنوان الجديد.شريط عنوان المتصفح & تاريخ التحديثات الخ.العميل يدفع تكلفة إضافية للتوصيل من وإلى التكلفة تختلف اعتمادا على الكمون.في أعمالنا ونحن إعادة توجيه الكثير كتبنا منطقتنا وحدة لتجنب استثناء تكلفة.

استجابة.إعادة توجيه هو أكثر تكلفة لأنه يضيف رحلة إضافية إلى الملقم إلى معرفة إلى أين تذهب.

الملقم.نقل أكثر كفاءة ولكن يمكن أن يكون قليلا من سوء مما يؤدي إلى المستخدم منذ Url لا تغيير جسديا.

في تجربتي, الفرق في الأداء لم يكن كبيرا بما يكفي لاستخدام هذا النهج الأخير

هناك العديد من الاختلافات على النحو المحدد أعلاه.وبصرف النظر قبل كل شيء, هناك واحد أكثر الفرق. Response.Redirect() يمكن استخدامها لإعادة توجيه المستخدم إلى أي الصفحة التي ليست جزءا من التطبيق ولكن Server.Transfer() لا يمكن إلا أن تستخدم لإعادة توجيه المستخدم داخل التطبيق.

//This will work.
Response.Redirect("http://www.google.com");

//This will not work.
Server.Transfer("http://www.google.com");

الملقم.نقل لا تغيير عنوان URL في مستعرض العميل بذلك على نحو فعال المتصفح لا أعرف هل تغيرت إلى آخر من جانب الملقم معالج.استجابة.إعادة توجيه المستعرض إلى الانتقال إلى صفحة مختلفة ، لذلك url في شريط العنوان التغييرات.

الملقم.نقل أسرع قليلا لأنه يتجنب واحدة ذهاب وإياب إلى الخادم ، ولكن من غير تغيير url قد تكون إما جيدة أو سيئة بالنسبة لك ، اعتمادا على ما كنت تحاول القيام به.

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

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

فقط المزيد من التفاصيل حول نقل(), انها في الواقع هو الخادم.تنفيذ() + رد.النهاية () ، مصدر التعليمات البرمجية أدناه (من مونو/.net 4.0):

public void Transfer (string path, bool preserveForm)
{
    this.Execute (path, null, preserveForm, true);
    this.context.Response.End ();
}

ومن أجل تنفيذ(), ما هو المدى هو معالج من مسار معين ، انظر

ASP.NET لا تحقق من أن المستخدم الحالي هو مخول لعرض الموارد ألقاه تنفيذ الأسلوب.على الرغم من أن ASP.NET تفويض المصادقة المنطق يعمل قبل المورد الأصلي معالج يطلق عليه ، ASP.NET مباشرة باستدعاء معالج أشار تنفيذ طريقة و لا إعادة المصادقة والتخويل المنطق مورد جديد.إذا كان التطبيق الخاص بك في السياسة الأمنية يتطلب العملاء لديك الإذن المناسب للوصول إلى الموارد ، يجب تطبيق القوة تفويض أو توفير مخصص التحكم في الوصول إليه.

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

-من MSDN

استجابة.توجيه ينطوي إضافية ذهابا وإيابا والتحديثات شريط العنوان.

الملقم.نقل لا يسبب شريط العنوان إلى تغيير يستجيب الملقم الطلب مع المحتوى من صفحة أخرى

على سبيل المثال

استجابة.إعادة توجيه:-

  1. على العميل يطلب المتصفح صفحة http://InitiallyRequestedPage.aspx
  2. على الملقم يستجيب إلى الطلب مع 302 اجتياز إعادة توجيه عنوان http://AnotherPage.aspx.
  3. على العميل المتصفح يجعل الطلب الثاني إلى العنوان http://AnotherPage.aspx.
  4. على الملقم يستجيب مع المحتوى من http://AnotherPage.aspx

الملقم.نقل:-

  1. على العميل يطلب المتصفح صفحة http://InitiallyRequestedPage.aspx
  2. على الخادم Server.نقل إلى http://AnotherPage.aspx
  3. على الملقم استجابة إلى طلب http://InitiallyRequestedPage.aspx يمر مرة أخرى من المحتوى http://AnotherPage.aspx

استجابة.إعادة توجيه

الايجابيات:- راحة - يتغير شريط العنوان ، عنوان يمكن استخدامها لتسجيل التغيرات في الدولة المنتصف الطلبات.

سلبيات:- بطيئة إضافية ذهابا وإيابا بين العميل والخادم.هذا يمكن أن تكون مكلفة عندما يكون هناك كبير الكمون بين العميل والخادم.

الملقم.نقل

الايجابيات:- سريعة.

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

استجابة.إعادة توجيه استجابة.إعادة توجيه() سوف نرسل لك إلى صفحة جديدة, تحديث شريط العنوان وإضافته إلى متصفح التاريخ.على المتصفح الخاص بك يمكنك النقر مرة أخرى.إعادة توجيه الطلب إلى بعض صفحات HTML واضحة على الخادم لدينا ، أو إلى ملقم ويب.ومن أسباب إضافية roundtrips إلى الخادم على كل طلب.فإنه لا يحافظ على سلسلة الاستعلام و شكل متغيرات من الطلب الأصلي.فإنه يمكن أن نرى الجديد إعادة توجيه عنوان URL الذي يتم توجيهه في المتصفح (و تكون قادرة على المرجعية في ذلك إذا كان ذلك ضروريا).استجابة.توجيه ببساطة يرسل رسالة إلى (HTTP 302) المتصفح.

الملقم.نقل الملقم.نقل() لا تغيير شريط العنوان ، لا يمكننا ضرب مرة أخرى.ينبغي للمرء أن استخدام الملقم.نقل() عندما قال انه/انها لا تريد المستخدم أن نرى أين هو ذاهب.في وقت ما على "تحميل" نوع الصفحة.أنه نقل الصفحة الحالية من طلب إلى آخر .صفحة aspx على نفس الخادم.فإنه يحافظ على موارد الخادم و تجنب لا لزوم لها roundtrips إلى الملقم.فإنه يحافظ على سلسلة الاستعلام و شكل متغيرات (اختياريا).فإنه لا تظهر الحقيقي URL حيث توجيه طلب في مستخدمي متصفح الويب.الملقم.يحدث نقل بدون المتصفح معرفة أي شيء ، المستعرض طلب صفحة ولكن الملقم بإرجاع محتوى آخر.

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