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();
    }
}
Murni
sumber

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 .

Murni
sumber
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
4

Cara lain untuk mem-bypass ini adalah dengan menjalankan kode berikut dalam aplikasi ASP Anda:

Response.TrySkipIisCustomErrors = true;

Sumber: /programming//a/21271085/238753

Sam
sumber
-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.

TomTom
sumber
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