Ada masalah aneh di sini. Semua orang tahu bahwa jika Anda menggunakan customErrors
bagian web.config untuk membuat halaman kesalahan kustom, Anda harus mengaturnya Response.StatusCode
ke apa pun yang sesuai. Misalnya, jika saya membuat halaman 404 tersuai dan menamainya 404.aspx, saya dapat memasukkan <% Response.StatusCode = 404 %>
isinya untuk membuatnya memiliki tajuk status 404 yang sebenarnya.
Ikuti saya sejauh ini? Baik. Sekarang coba lakukan ini di IIS7. Saya tidak bisa membuatnya bekerja, titik. Jika Response.StatusCode
diatur di halaman kesalahan kustom, IIS7 tampaknya menimpa halaman kesalahan kustom sepenuhnya, dan menampilkan halaman statusnya sendiri (jika Anda memiliki yang dikonfigurasi.)
Apakah ada orang lain yang melihat perilaku ini dan mungkin juga tahu cara mengatasinya? Itu bekerja di bawah IIS6, jadi saya tidak tahu mengapa banyak hal berubah.
Catatan: Ini tidak sama dengan masalah di ASP.NET Custom 404 Returning 200 OK Alih-alih 404 Not Found
Jawaban:
Tetapkan existingResponse ke PassThrough di bagian system.webServer / httpErrors:
Nilai default dari properti existingResponse adalah Otomatis:
Informasi selengkapnya: Apa yang diharapkan dari modul kesalahan kustom IIS7
sumber
<httpErrors existingResponse="PassThrough" />
setara denganResponse.TrySkipIisCustomErrors
atau apakah mereka berperilaku berbeda?Response.TrySkipIisCustomErrors
Anda mendapatkan kontrol yang lebih baik saat menampilkan kesalahan kustom IIS.Cara termudah untuk membuat perilaku konsisten adalah dengan menghapus kesalahan dan menggunakan Response.TrySkipIisCustomErrors dan menyetelnya ke true. Ini akan menimpa penanganan halaman kesalahan global IIS dari dalam halaman Anda atau penangan kesalahan global di Application_Error.
Biasanya Anda harus melakukan ini di penangan Application_Error Anda yang menangani semua kesalahan yang tidak ditangkap oleh penangan kesalahan aplikasi Anda.
Info lebih rinci dapat ditemukan di posting blog ini: http://www.west-wind.com/weblog/posts/745738.aspx
sumber
customError
dikonfigurasi dalam Web.config untuk memicu. DenganResponse.TrySkipIisCustomErrors = true
Saya mendapatkan perilaku yang sama: Halaman kesalahan jelek yang dihasilkan server ditampilkan. Dengan itu diatur kefalse
tidak ada yang terjadi - jendela browser kosong.Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
customErrors mode="Off"
agar ini berfungsi. Jika saya melakukannya, maka httpErrors existingResponse = "Auto" (default) berfungsi dengan baik untuk saya ketika saya menggunakan kode dalam jawaban ini.Dipecahkan: Ternyata "Kesalahan Terperinci" perlu diaktifkan agar IIS7 "melewati" halaman kesalahan yang mungkin Anda miliki. Lihat http://forums.iis.net/t/1146653.aspx
sumber
Saya tidak yakin apakah ini serupa atau tidak, tetapi saya memecahkan masalah yang terdengar serupa di permukaan dan inilah cara saya menanganinya.
Pertama-tama, nilai default untuk existingResponse (Auto) adalah jawaban yang benar dalam kasus saya, karena saya memiliki 404, 400, dan 500 kustom (saya dapat membuat yang lain, tetapi ketiganya sudah cukup untuk apa yang saya lakukan). Berikut adalah bagian relevan yang membantu saya.
Dari web.config:
Dan
Dari sana, saya menambahkan ini ke Application_Error di global.asax:
Pada setiap halaman kesalahan kustom saya, saya harus menyertakan kode status respons yang benar. Dalam kasus saya, saya menggunakan 404 tersuai untuk mengirim pengguna ke bagian berbeda dari situs saya, jadi saya tidak ingin kode status 404 dikembalikan kecuali itu sebenarnya adalah laman mati.
Bagaimanapun, begitulah cara saya melakukannya. Harapan yang membantu seseorang.
sumber
Masalah ini sangat memusingkan. Tidak ada saran yang disebutkan sebelumnya yang menyelesaikannya untuk saya, jadi saya menyertakan solusi saya. Sebagai catatan, lingkungan / platform kami menggunakan:
Secara khusus, saya mencoba mendapatkan respons HTTP 404 yang akan mengarahkan pengguna ke halaman 404 tersuai kami (melalui pengaturan Web.config).
Pertama, kode saya harus membuang
HttpException
. Mengembalikan aNotFoundResult
dari pengontrol tidak mencapai hasil yang saya cari.Lalu aku harus mengkonfigurasi kedua yang
customErrors
danhttpError
node di web.config....
Perhatikan bahwa saya meninggalkan
existingResponse
asAuto
, yang berbeda dari solusi yang disediakan @sefl.The
customErrors
pengaturan tampaknya diperlukan untuk menangani saya secara eksplisit dilemparkanHttpException
, sedangkanhttpErrors
simpul ditangani URL yang jatuh di luar pola rute yang ditentukan dalam Globals.asax.cs.PS Dengan pengaturan ini saya tidak perlu mengatur
Response.TrySkipIisCustomErrors
sumber
TrySkipIisCustomErrors
hanyalah bagian dari teka-teki. Jika Anda menggunakan Halaman Kesalahan Khusus tetapi Anda juga ingin mengirimkan beberapa konten RESTful berdasarkan status 4xx, maka Anda mengalami masalah. Menyetel httpErrors.existingResponse web.config ke "Otomatis" tidak berfungsi, karena .net tampaknya selalu mengirimkan beberapa konten halaman ke IIS, oleh karena itu menggunakan "Otomatis" menyebabkan semua (atau setidaknya beberapa) Halaman Kesalahan Kustom tidak digunakan. Menggunakan "Ganti" juga tidak akan berfungsi, karena tanggapan akan berisi kode status http Anda, tetapi isinya akan kosong atau diisi dengan Halaman Kesalahan Khusus. Dan "PassThrough" ternyata mematikan CEP, sehingga tidak bisa digunakan.Jadi jika Anda ingin melewati CEP untuk beberapa kasus (dengan melewati maksud saya mengembalikan status 4xx dengan beberapa konten) Anda akan memerlukan langkah tambahan: bersihkan kesalahan:
Jadi jika Anda ingin menggunakan respons REST (mis. 400 - Permintaan Buruk) dan mengirim beberapa konten dengannya, Anda hanya perlu menyetel
TrySkipIisCustomErrors
suatu tempat dalam tindakan dan menyetelexistingResponse
ke "Otomatis" di bagian httpErrors di web.config. Sekarang:Jika Anda ingin mengembalikan status dengan konten kosong dari tindakan Anda, tindakan itu akan diperlakukan sebagai respons kosong dan CEP akan ditampilkan, jadi ada ruang untuk meningkatkan kode ini.
sumber
Secara default IIS 7 menggunakan pesan kesalahan kustom rinci jadi saya akan berasumsi bahwa Response.StatusCode akan sama dengan 404.XX daripada hanya 404.
Anda dapat mengkonfigurasi IIS7 untuk menggunakan kode pesan kesalahan yang lebih sederhana atau mengubah kode Anda menangani pesan kesalahan yang lebih rinci yang ditawarkan IIS7.
Info lebih lanjut tersedia di sini: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx
Penyelidikan lebih lanjut mengungkapkan bahwa saya salah jalan - pesan rinci tidak secara default tetapi mungkin mereka telah diaktifkan, di kotak Anda jika Anda melihat pesan kesalahan berbeda yang Anda sebutkan.
sumber