IIS mengganti konten respons saya, jika saya mengatur Response.StatusCode secara manual


20

Masalah

ketika saya secara manual mengatur HTTP Statusaliran respons saya ke, katakanlah, 404atau 503, IIS merender konten / tampilan IIS stok, alih-alih tampilan kustom saya.

Ketika saya melakukan ini dengan server pengembangan web (AKA. Cassini ), ia berfungsi dengan benar (yaitu, konten saya ditampilkan dan response.statuscode== data yang saya masukkan).

Apakah ada cara saya bisa mengesampingkan perilaku ini?

Cara Replikasi

Buat aplikasi web ASP.NET MVC1 default. Tambahkan rute berikut

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

Sekarang ganti metode Indeks HomeController's dengan ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}

Jawaban:


18

Oke - temukan jawabannya. Seperti yang saya harapkan, IIS membajak non 200 tanggapan saya. Tidak yakin (mis. Saya tidak yakin apakah ini adalah perilaku default ATAU itu karena pengaturan salah satu anggota tim yang diperbarui dalam konfigurasi mesin, dll ...).

Bagaimanapun, kuncinya di sini adalah memberitahu IIS untuk tidak menangani sumber daya hasil status non-200.

Bagaimana? Entri konfigurasi di web.config.

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

Sekarang, kuncinya di sini adalah existingResponse="PassThrough". Bocah nakal itu memberitahu IIS untuk meninggalkan sumber daya saya sendiri jika kode status HTTP! = 200.

Ingin info lebih lanjut? Tentu: Baca Lebih Lanjut tentang Elemen ini di Situs Web IIS Resmi .


httpErrors seperti Halaman Kesalahan -> 500 -> Edit Pengaturan Fitur -> "Kesalahan Detail" ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet

aaaahhh .. Baik IIS membuat hal-hal mudah menjadi sulit :)
AR


-2

Hati-hati dengan pendekatan itu secara umum. Anda TIDAK boleh membuat tampilan status 404.

  • Saya pikir ketika kode status kesalahan dikembalikan, IIS mengembalikan halaman kesalahan status yang terdaftar dengannya - bukan output dari pemrosesan. Jadi, Anda dapat meletakkan halaman HTML di sana (atau tautan ke halaman aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx memiliki penjelasan yang bagus tentang cara mengatur halaman kesalahan.

  • Tapi itu tidak relevan. Cukup banyak peramban yang secara default TIDAK menunjukkan keluaran itu, tetapi ada sesuatu yang diatur dalam peramban itu. Jadi, jika Anda mengandalkan orang yang melihat halaman 404 Anda - itu mungkin tidak terjadi. Mereka mungkin melihat halaman 404 yang diatur di browser untuk mereka.


1
Mengapa saya tidak menampilkan tampilan pada 404? saya ingin halaman khusus, dan halaman saya mungkin memerlukan beberapa logika (bukan halaman kesalahan html statis).
Pure.Krome

karena model MVC tidak berintegrasi dengan model halaman kesalahan IIS. Sesederhana itu. Anda harus kembali ke model IIS untuk itu. Daftarkan URL halaman untuk case 404. Letakkan beberapa halaman dinamis di sana - saya tidak yakin apakah ini sebenarnya BISA menunjuk kembali ke url MVC, tetapi itu berasal dari pendaftaran halaman 404.
TomTom

Salah. Sebagian besar browser akan membuat konten halaman yang dikembalikan dengan status HTTP 404. Tidak semua, tetapi kebanyakan. Selain itu, IIS secara default akan menghormati kode status yang ditetapkan oleh kode apa pun di situs .NET, selama tidak ada modul lain yang menimpanya kemudian di dalam pipeline. Lihat jawaban pertanyaan penulis tentang bagaimana hal itu terjadi dalam kasus ini.
Mufasa
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.