Pertanyaan Mengapa saya mendapatkan "Tidak dapat mengalihkan setelah header HTTP dikirim" ketika saya memanggil Response.Redirect ()?


Ketika saya menelepon Response.Redirect(someUrl) Saya mendapatkan HttpException: "Tidak dapat mengalihkan setelah header HTTP dikirim".

Mengapa saya mendapatkan ini? Dan bagaimana cara saya memperbaiki masalah ini?


76
2017-10-01 20:22


asal


Jawaban:


Menurut dokumentasi MSDN untuk Response.Redirect(string url), itu akan melemparkan HttpException ketika "redirection dicoba setelah header HTTP telah dikirim". Sejak Response.Redirect(string url) menggunakan header respons Http "Lokasi" (http://en.wikipedia.org/wiki/HTTP_headers#Responses), memanggilnya akan menyebabkan header dikirim ke klien. Ini berarti bahwa jika Anda memanggilnya untuk kedua kalinya, atau jika Anda memanggilnya setelah Anda menyebabkan header dikirim dengan cara lain, Anda akan mendapatkan HttpException.

Salah satu cara untuk mencegah panggilan Response.Redirect () beberapa kali adalah untuk memeriksa Response.IsRequestBeingRedirected properti (bool) sebelum memanggilnya.

// Causes headers to be sent to the client (Http "Location" response header)
Response.Redirect("http://www.stackoverflow.com");
if (!Response.IsRequestBeingRedirected)
    // Will not be called
    Response.Redirect("http://www.google.com");

112
2017-10-01 20:25



Setelah Anda mengirim konten apa pun kepada klien, header HTTP telah dikirim. SEBUAH Response.Redirect() panggilan bekerja dengan mengirimkan informasi khusus di header yang membuat browser meminta URL yang berbeda.

Karena header sudah dikirim, asp.net tidak dapat melakukan apa yang Anda inginkan (memodifikasi header)

Anda bisa menyelesaikan ini dengan a) baik melakukan Pengalihan sebelum Anda melakukan hal lain, atau b) coba gunakan Response.Buffer = true sebelum Anda melakukan hal lain, untuk memastikan bahwa tidak ada output yang dikirim ke klien sampai seluruh halaman selesai dijalankan.


16
2017-10-01 20:27



A Redirect hanya dapat terjadi jika baris pertama dalam pesan HTTP adalah "HTTP/1.x 3xx Redirect Reason".

Jika Anda sudah menelepon Response.Write() atau menyetel beberapa tajuk, ini akan terlambat untuk pengalihan. Anda dapat mencoba menelepon Response.Headers.Clear() sebelum Pengalihan untuk melihat apakah itu membantu.


7
2017-10-01 20:24



Cukup periksa apakah Anda telah mengatur opsi buffering ke false (secara default benar). Untuk tanggapan.tolak bekerja,

  1. Buffer seharusnya benar,
  2. Anda seharusnya tidak mengirim lebih banyak data menggunakan response.write yang melebihi ukuran buffer default (dalam hal ini flush itu sendiri menyebabkan header dikirim) oleh karena itu tidak mengizinkan Anda untuk mengalihkan.

3
2018-05-01 09:27



Menggunakan return RedirectPermanent(myUrl) bekerja untukku


2
2018-03-23 08:45



Ada satu jawaban sederhana untuk ini: Anda telah menghasilkan sesuatu yang lain, seperti teks, atau apa pun yang terkait dengan output dari halaman Anda sebelum Anda mengirim header Anda. Ini mempengaruhi mengapa Anda mendapatkan kesalahan itu.

Cukup periksa kode Anda untuk output yang mungkin atau Anda dapat menempatkan header di atas metode Anda sehingga akan dikirim terlebih dahulu.


1
2018-01-14 03:07



Masalah saya diselesaikan dengan menambahkan Exception Handler untuk ditangani "Tidak dapat mengalihkan setelah header HTTP dikirim". Kesalahan ini seperti yang ditunjukkan di bawah kode

catch (System.Threading.ThreadAbortException)
        {
            // To Handle HTTP Exception "Cannot redirect after HTTP headers have been sent".
        }
        catch (Exception e)
        {//Here you can put your context.response.redirect("page.aspx");}

1
2018-01-08 12:02