Server.Transfer Vs. Response.Redirect


263

Apa perbedaan antara Server.Transferdan Response.Redirect?

  • Apa kelebihan dan kekurangan masing-masing?
  • Kapan yang satu lebih baik dari yang lain?
  • Kapan salah satu tidak tepat?

3
Keuntungan dan kerugian telah dinyatakan dalam situs di bawah ini. developer.com/net/asp/article.php/3299641 Satu hal yang menarik dalam artikel ini adalah bahwa Server.Transfer mengkonsumsi lebih banyak daya server dibandingkan dengan Server.Redirect.
Ray Lu

Server.Transfer mengurangi permintaan halaman, jadi saya kira itu "lebih baik" dalam hal itu. Namun, Response.Redirect dapat mengirim pengguna ke situs eksternal sementara Server.Transfer tidak bisa.
codeConcussion

1
Jika Anda berjalan pada modus IIS 7 Integrated, Anda mungkin perlu mempertimbangkan menggunakan Server.TransferRequestbukan Server.Transfer.
Haacked

@Haacked seharusnya sudah membaca bahwa pada awalnya, Server.TransferRequest menyelesaikan masalah saya dengan matriks web dan iis7. Gracias. Mereka harus meletakkannya di sini.
Jason Sebring

Jawaban:


234

Response.Redirectcukup mengirim pesan (HTTP 302) ke browser.

Server.Transfer terjadi tanpa browser mengetahui apa pun, browser meminta halaman, tetapi server mengembalikan konten yang lain.


Apakah ini berfungsi dengan halaman CSHTML dengan matriks web? Sepertinya saya tidak bisa membuatnya berfungsi ketika melakukan Server.Transfer ke halaman CSHTML seperti Server.Transfer ("~ / somepage.cshtml", true) tetapi tampaknya berfungsi untuk jenis halaman lain. Ya saya telah menginstal pisau cukur dan halaman berfungsi seperti yang diharapkan sebaliknya.
Jason Sebring

11
Hei ketahuan. Anda harus menggunakan Server.TransferRequest untuk halaman matriks web cshtml.
Jason Sebring

apakah Server.Transfer () hanya mentransfer ke halaman fisik? untuk mis. jika saya transfer ke Server.Transfer ("default / category1.aspx") maka apakah perlu memiliki folder default dan sebuah kategori1, halaman aspx di dalamnya?
ihimv

95

Response.Redirect()akan mengirim Anda ke halaman baru, memperbarui bilah alamat dan menambahkannya ke Riwayat Peramban. Di browser Anda, Anda dapat mengklik kembali.

Server.Transfer()tidak mengubah bilah alamat. Anda tidak bisa membalas.

Saya gunakan Server.Transfer()ketika saya tidak ingin pengguna melihat ke mana saya pergi. Terkadang pada halaman jenis "memuat".

Kalau tidak, saya akan selalu menggunakan Response.Redirect().


75

To be Short: Response.Redirectcukup beri tahu browser untuk mengunjungi halaman lain. Server.Transfermembantu mengurangi permintaan server, menjaga URL tetap sama dan, dengan sedikit bug-bashing, memungkinkan Anda untuk mentransfer string kueri dan variabel bentuk.

Sesuatu yang saya temukan dan setujui dengan ( sumber ):

Server.Transferserupa karena mengirim pengguna ke halaman lain dengan pernyataan seperti Server.Transfer("WebForm2.aspx"). Namun, pernyataan itu memiliki sejumlah kelebihan dan kekurangan yang berbeda.

Pertama, mentransfer ke halaman lain menggunakan Server.Transfer sumber daya server. Alih-alih mengatakan browser untuk mengarahkan, itu hanya mengubah "fokus" pada server Web dan mentransfer permintaan. Ini berarti Anda tidak mendapatkan cukup banyak permintaan HTTP yang datang, yang karenanya memudahkan tekanan pada server Web Anda dan membuat aplikasi Anda berjalan lebih cepat.

Tetapi hati-hati: karena proses "transfer" hanya dapat berfungsi pada situs-situs yang berjalan di server; Anda tidak dapat menggunakan Server.Transferuntuk mengirim pengguna ke situs eksternal. Hanya Response.Redirectbisa melakukan itu.

Kedua, Server.Transferpertahankan URL asli di browser. Ini benar-benar dapat membantu merampingkan teknik entri data, meskipun mungkin membuat kebingungan saat debugging.

Itu belum semuanya: Server.TransferMetode ini juga memiliki parameter kedua— "preserveForm". Jika Anda menyetel ini ke True, menggunakan pernyataan seperti Server.Transfer("WebForm2.aspx", True), string kueri yang ada dan variabel bentuk apa pun masih akan tersedia untuk halaman yang Anda transfer.

Misalnya, jika WebForm1.aspx Anda memiliki kontrol TextBox yang disebut TextBox1 dan Anda ditransfer ke WebForm2.aspx dengan parameter preserveForm diatur ke True, Anda akan dapat mengambil nilai kontrol TextBox halaman asli dengan referensi Request.Form("TextBox1").


10
+1 untuk komentar tetapi ini sepertinya disalin secara verbatim dari developer.com/net/asp/article.php/3299641 . Jika berasal dari sumber lain, Anda harus mengutipnya.
Johnno Nolan

... tetapi mereka telah menyalinnya, mereka harus mengutip Anda.
Johnno Nolan

7
Saya berkata: Sesuatu yang saya temukan dan setujui;
TStamper

6
Harus menautkan ke sumber dan menggunakan pemformatan / penyorotan kutipan untuk bagian yang disalin.
Chris W. Rea

1
Bagaimana bisa maintaining the original URL... ...really help streamline data entry techniques?
JohnB

36

Response.Redirect() harus digunakan ketika:

  • kami ingin mengarahkan permintaan ke beberapa halaman HTML biasa di server kami atau ke beberapa server web lainnya
  • kami tidak peduli tentang menyebabkan bolak-balik tambahan ke server pada setiap permintaan
  • kita tidak perlu melestarikan String Kueri dan Variabel Formulir dari permintaan asli
  • kami ingin pengguna kami dapat melihat URL yang dialihkan baru di mana dia diarahkan di browser-nya (dan dapat membookmarknya jika diperlukan)

Server.Transfer() harus digunakan ketika:

  • kami ingin mentransfer permintaan halaman saat ini ke halaman .aspx lain di server yang sama
  • kami ingin melestarikan sumber daya server dan menghindari pulang pergi yang tidak perlu ke server
  • kami ingin menjaga Variabel Kueri dan Bentuk (opsional)
  • kami tidak perlu menampilkan URL asli tempat kami mengarahkan permintaan di Browser Web pengguna

2
Jauh lebih jelas, bagi saya ini lebih baik sebagai jawaban yang diterima.
Baljeetsingh

28

Response.Redirect redirect halaman ke halaman lain setelah halaman pertama tiba ke klien. Jadi klien tahu pengalihan.

Server.Transfer keluar dari eksekusi halaman saat ini. Klien tidak tahu pengalihan. Ini memungkinkan Anda untuk mentransfer string kueri dan variabel bentuk.

Jadi itu tergantung kebutuhan Anda untuk memilih mana yang lebih baik.


1
Bisakah pengguna jahat mem-bypass Response.Redirectsehingga memuat halaman asli meskipun saya telah menelepon Response.Redirect?
northben

@northben - Tidak pernah mudah untuk mengatakan "tidak" ketika datang ke teknologi karena hampir semua hal dapat dikompromikan - tetapi dalam hal ini bagaimana mungkin mereka - saya akan mengatakan tidak mereka tidak bisa ... tapi saya sudah terbukti salah berkali-kali dalam hidup.
JonH

23

masukkan deskripsi gambar di sini

"response.redirect" dan "server.transfer" membantu mentransfer pengguna dari satu halaman ke halaman lainnya saat halaman sedang dieksekusi. Tetapi cara mereka melakukan transfer / redirect ini sangat berbeda.

Jika Anda seorang pria visual dan ingin melihat demonstrasi daripada teori saya sarankan untuk melihat video facebook di bawah ini yang menjelaskan perbedaannya dengan cara yang lebih demonstratif.

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

Perbedaan utama di antara mereka adalah siapa yang melakukan transfer. Di "response.redirect" transfer dilakukan oleh browser sedangkan di "server.transfer" itu dilakukan oleh server. Mari kita coba memahami pernyataan ini secara lebih rinci.

Dalam "Server.Transfer" berikut ini adalah urutan bagaimana transfer terjadi: -

1. Pengguna mengirimkan permintaan ke halaman ASP.NET. Pada gambar di bawah ini permintaan dikirim ke "WebForm1" dan kami ingin menavigasi ke "Webform2".

2. Server mulai menjalankan "Webform1" dan siklus hidup halaman dimulai. Tetapi sebelum siklus hidup lengkap dari halaman selesai "Server.transfer" terjadi pada "WebForm2".

3. Objek halaman "Webform2" dibuat, siklus hidup halaman penuh dieksekusi dan output respon HTML kemudian dikirim ke browser.

masukkan deskripsi gambar di sini

Sementara di "Response.Redirect" berikut ini adalah urutan acara untuk navigasi: -

1. Klien (browser) mengirim permintaan ke halaman. Pada gambar di bawah ini permintaan dikirim ke "WebForm1" dan kami ingin menavigasi ke "Webform2".

2.Life cycle "Webform1" mulai dijalankan. Tetapi di antara siklus hidup "Response.Redirect" terjadi.

3.Sekarang alih-alih server melakukan pengalihan, ia mengirim perintah HTTP 302 ke browser. Perintah ini memberi tahu browser bahwa ia harus memulai permintaan GET ke halaman "Webform2.aspx".

4.Browser menginterpretasikan perintah 302 dan mengirimkan permintaan GET untuk "Webform2.aspx".

masukkan deskripsi gambar di sini

Dengan kata lain "Server.Transfer" dijalankan oleh server sementara "Response.Redirect" dijalankan oleh browser. "Response.Redirect" perlu dua permintaan untuk melakukan redirect halaman.

Jadi kapan harus menggunakan "Server.Transfer" dan kapan menggunakan "Response.Redirect"?

Gunakan "Server.Transfer" ketika Anda ingin menavigasi halaman yang berada di server yang sama, gunakan "Response.Redirect" ketika Anda ingin menavigasi antara halaman yang berada di server dan domain yang berbeda.

masukkan deskripsi gambar di sini

Di bawah ini adalah tabel ringkasan yang menuliskan perbedaan dan skenario yang digunakan.

masukkan deskripsi gambar di sini


Berguna saat masalah menggunakan Server.Transfer dan Response.Redirect stackoverflow.com/questions/1433448/thread-was-being-aborted
Kiquenet

Untuk Server.Transfer: server yang sama atau situs web IIS yang sama ?
Kiquenet

Bisakah Anda memperbarui paragraf berikut karena setidaknya 6 karakter diperlukan untuk edit saya: Dengan kata lain "Server.Transfer" dijalankan oleh server sementara "Response.Redirect" dijalankan oleh browser thr . "Response.Redirect" perlu dua permintaan untuk melakukan redirect halaman.
paul cheung

11

Keindahan Server.Transfer adalah apa yang dapat Anda lakukan dengannya:

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

Anda bisa mendapatkan apa pun dari halaman sebelumnya menggunakan metode di atas selama Anda menggunakan Server.Transfer tetapi tidak Response.Redirect


10

Selain komentar ScarletGarden, Anda juga perlu mempertimbangkan dampak mesin pencari dan pengalihan Anda. Sudahkah halaman ini dipindahkan secara permanen? Untuk sementara? Itu membuat perbedaan.

lihat: Response.Redirect vs. "301 Pindah Secara Permanen" :

Kita semua pernah menggunakan Response.Redirect pada satu waktu atau yang lain. Ini adalah cara cepat dan mudah untuk membuat pengunjung diarahkan ke arah yang benar jika mereka entah bagaimana berakhir di tempat yang salah. Tetapi tahukah Anda bahwa Response.Redirect mengirim kode status respons HTTP "302 Found" ketika Anda mungkin benar-benar ingin mengirim "301 Pindah Secara Permanen"?

Perbedaannya tampak kecil, tetapi dalam kasus-kasus tertentu itu sebenarnya dapat membuat perbedaan besar. Misalnya, jika Anda menggunakan kode respons "301 Moved Permanently", sebagian besar mesin pencari akan menghapus tautan usang dari indeks mereka dan menggantinya dengan yang baru. Jika Anda menggunakan "302 Ditemukan", mereka akan terus kembali ke halaman lama ...


Tautan tidak berfungsi. Gunakan tautan web.archive.org ini sebagai gantinya.
stomy

6

Transfer sepenuhnya pada sisi server. Bilah alamat klien tetap konstan. Beberapa kompleksitas tentang transfer konteks antar permintaan. Pembilasan dan memulai kembali penangan halaman bisa jadi mahal, jadi lakukan transfer Anda di awal pipeline misalnya dalam HttpModule selama BeginRequest. Baca dokumen MSDN dengan hati-hati, dan uji dan pahami nilai-nilai baru HttpContext.Request - terutama dalam skenario Postback. Kami biasanya menggunakan Server.Transfer untuk skenario kesalahan.

Redirect mengakhiri permintaan dengan status 302 dan respons pulang-pergi sisi klien dengan dan memakan pengecualian secara internal (hit server minor - tergantung berapa banyak yang Anda lakukan sehari) Klien kemudian menavigasi ke alamat baru. Bilah alamat peramban & pembaruan riwayat, dll. Klien membayar biaya pulang-pergi tambahan - biaya bervariasi tergantung pada latensi. Dalam bisnis kami, kami mengarahkan banyak hal. Kami menulis modul sendiri untuk menghindari biaya pengecualian.


6

Ada banyak perbedaan seperti yang ditentukan di atas. Terlepas dari semua itu, ada satu lagi perbedaan. Response.Redirect()dapat digunakan untuk mengalihkan pengguna ke halaman mana pun yang bukan bagian dari aplikasi tetapi Server.Transfer()hanya dapat digunakan untuk mengarahkan pengguna di dalam aplikasi.

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

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

5

Response.Redirect lebih mahal karena menambahkan perjalanan tambahan ke server untuk mencari tahu ke mana harus pergi.

Server.Transfer lebih efisien namun dapat sedikit salah mengarahkan pengguna karena Url tidak berubah secara fisik.

Dalam pengalaman saya, perbedaan kinerja belum cukup signifikan untuk menggunakan pendekatan yang terakhir


4

Server.Transfer tidak mengubah URL di browser klien, jadi secara efektif browser tidak tahu Anda berubah menjadi penangan sisi server lainnya. Response.Redirect memberitahu browser untuk pindah ke halaman yang berbeda, sehingga url di bilah judul berubah.

Server.Transfer sedikit lebih cepat karena menghindari satu bolak-balik ke server, tetapi perubahan url mungkin tidak baik atau buruk untuk Anda, tergantung pada apa yang Anda coba lakukan.


4

Response.Redirect: memberi tahu browser bahwa halaman yang diminta dapat ditemukan di lokasi baru. Browser kemudian memulai permintaan lain ke halaman baru memuat isinya di browser. Ini menghasilkan dua permintaan oleh browser.

Server.Transfer: Ini mentransfer eksekusi dari halaman pertama ke halaman kedua di server. Sejauh menyangkut klien browser, ia membuat satu permintaan dan halaman awal adalah yang merespons dengan konten. Manfaat dari pendekatan ini adalah satu perjalanan pulang pergi ke server dari browser klien. Juga, setiap variabel bentuk yang diposting dan parameter string kueri juga tersedia untuk halaman kedua.


3

Lebih detail tentang Transfer (), sebenarnya adalah Server.Execute () + Response.End (), kode sumbernya di bawah (dari Mono / .net 4.0):

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

dan untuk Execute (), apa yang harus dijalankan adalah handler dari path yang diberikan, lihat

ASP.NET tidak memverifikasi bahwa pengguna saat ini berwenang untuk melihat sumber daya yang dikirimkan oleh metode Execute . Meskipun logika otorisasi dan otentikasi ASP.NET berjalan sebelum penangan sumber daya asli dipanggil, ASP.NET secara langsung memanggil penangan yang ditunjukkan oleh metode Execute dan tidak menjalankan kembali logika otentikasi dan otorisasi untuk sumber daya baru. Jika kebijakan keamanan aplikasi Anda mengharuskan klien memiliki otorisasi yang sesuai untuk mengakses sumber daya, aplikasi harus memaksa otorisasi ulang atau memberikan mekanisme kontrol akses khusus.

Anda dapat memaksa otorisasi ulang dengan menggunakan metode Redirect alih-alih metode Execute . Redirect melakukan pengalihan sisi klien di mana browser meminta sumber daya baru. Karena pengalihan ini adalah permintaan baru yang masuk ke sistem, itu tunduk pada semua logika otentikasi dan otorisasi dari kedua Layanan Informasi Internet (IIS) dan kebijakan keamanan ASP.NET.

- dari MSDN


2

Response.Redirect melibatkan perjalanan pulang-pergi tambahan dan memperbarui bilah alamat.

Server.Transfer tidak menyebabkan bilah alamat berubah, server merespons permintaan dengan konten dari halaman lain

misalnya

Response.Redirect: -

  1. Pada klien, browser meminta halaman http: //InitiallyRequestedPage.aspx
  2. Di server menanggapi permintaan dengan 302 melewati alamat pengalihan http: //AnotherPage.aspx .
  3. Pada klien, browser membuat permintaan kedua ke alamat http: //AnotherPage.aspx .
  4. Di server merespons dengan konten dari http: //AnotherPage.aspx

Server.Transfer: -

  1. Pada browser klien meminta halaman http: //InitiallyRequestedPage.aspx
  2. Di server Server.Transfer ke http: //AnotherPage.aspx
  3. Di server tanggapan dibuat untuk permintaan http: //InitiallyRequestedPage.aspx meneruskan kembali konten dari http: //AnotherPage.aspx

Response.Redirect

Kelebihan: - TENANG - Ini mengubah bilah alamat, alamat dapat digunakan untuk mencatat perubahan keadaan antara permintaan.

Cons: - Lambat - Ada round-trip tambahan antara klien dan server. Ini bisa mahal ketika ada latensi yang substansial antara klien dan server.

Server.Transfer

Pro: - Cepat.

Kontra: - Status hilang - Jika Anda menggunakan Server.Transfer untuk mengubah status aplikasi sebagai respons terhadap kiriman balik, jika laman tersebut dimuat ulang, status itu akan hilang, karena bilah alamat akan sama seperti sebelumnya. atas permintaan pertama.


0

Response.Redirect Response.Redirect () akan mengirim Anda ke halaman baru, memperbarui bilah alamat dan menambahkannya ke Riwayat Peramban. Di browser Anda, Anda dapat mengklik kembali. Ini mengalihkan permintaan ke beberapa halaman HTML biasa di server kami atau ke beberapa server web lainnya. Ini menyebabkan bolak-balik tambahan ke server pada setiap permintaan. Itu tidak menyimpan String Query dan Variabel Formulir dari permintaan asli. Ini memungkinkan untuk melihat URL yang dialihkan baru di mana ia diarahkan di browser (dan dapat membookmarknya jika diperlukan). Tanggapan. Redirect hanya mengirim pesan ke browser (HTTP 302).

Server.Transfer Server.Transfer () tidak mengubah bilah alamat, kami tidak bisa membalas. Seseorang harus menggunakan Server.Transfer () ketika dia tidak ingin pengguna melihat ke mana ia pergi. Kadang di halaman jenis "memuat". Ini mentransfer permintaan halaman saat ini ke halaman .aspx lain di server yang sama. Ini menjaga sumber daya server dan menghindari pulang pergi yang tidak perlu ke server. Ini mempertahankan String Query dan Variabel Bentuk (opsional). Itu tidak menunjukkan URL asli di mana ia mengarahkan permintaan di Browser Web pengguna. Server.Transfer terjadi tanpa browser mengetahui apa-apa, browser meminta halaman, tetapi server mengembalikan konten yang lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.