GÜNCELLEME
Bu yanıt bir çözüm sağladığından, onu düzenlemeyeceğim, ancak bu sorunu çözmenin çok daha temiz bir yolunu buldum. Ayrıntılar için diğer cevabıma bakın ...
Orijinal Cevap: Yöntemin
neden kullanılmadığını anladım Application_Error()
...
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
...
}
Varsayılan olarak (yeni bir proje oluşturulduğunda), bir MVC uygulamasının Global.asax.cs
dosyada . Bu mantık, yolları haritalamak ve filtreleri kaydetmek için kullanılır. Varsayılan olarak, yalnızca bir filtre kaydeder: bir HandleErrorAttribute
filtre. CustomErrors açık olduğunda (veya RemoteOnly olarak ayarlandığında uzak istekler aracılığıyla), HandleErrorAttribute, MVC'ye bir Hata görünümü aramasını söyler ve Application_Error()
yöntemi asla çağırmaz . Bunun belgesini bulamadım, ancak programmers.stackexchange.com adresindeki bu yanıtta açıklandı .
İşlenmemiş her istisna için çağrılan ApplicationError () yöntemini almak için , HandleErrorAttribute filtresini kaydeden satırı basitçe kaldırın.
Şimdi sorun şu: CustomErrors istediğiniz şeyi elde etmek için nasıl yapılandırılır ...
CustomErrors bölümü varsayılan olarak redirectMode="ResponseRedirect"
. DefaultRedirect özniteliğini de bir MVC yolu olarak belirtebilirsiniz. Çok basit bir ErrorController oluşturdum ve web.config'imi böyle görünecek şekilde değiştirdim ...
web.config
<customErrors mode="RemoteOnly" redirectMode="ResponseRedirect" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound" />
</customErrors>
Bu çözümle ilgili sorun, hata URL'lerinize 302 yönlendirmesi yapması ve ardından bu sayfaların bir 200 durum kodu ile yanıt vermesidir. Bu, Google'ın kötü olan hata sayfalarını indekslemesine yol açar. Ayrıca HTTP spesifikasyonuna çok da uygun değildir. Yapmak istediğim şey yeniden yönlendirmemek ve özel hata görünümlerimle orijinal yanıtın üzerine yazmaktı.
Değiştirmeye çalıştım redirectMode="ResponseRewrite"
. Ne yazık ki, bu seçenek MVC yollarını desteklemez , yalnızca statik HTML sayfalarını veya ASPX'i destekler. İlk başta statik bir HTML sayfası kullanmayı denedim, ancak yanıt kodu hala 200'dü ama en azından yönlendirme yapmadı. Daha sonra bu cevaptan bir fikir edindim ...
Hata işleme için MVC'den vazgeçmeye karar verdim. Bir Error.aspx
ve bir oluşturdum PageNotFound.aspx
. Bu sayfalar çok basitti ama bir parça sihir vardı ...
<script type="text/C#" runat="server">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.StatusCode = (int) System.Net.HttpStatusCode.InternalServerError;
}
</script>
Bu blok, sayfaya doğru durum kodunun sunulmasını söyler. Kaba, PageNotFound.aspx sayfasında HttpStatusCode.NotFound
bunun yerine kullandım . Web.config dosyamı böyle görünecek şekilde değiştirdim ...
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx">
<error statusCode="404" redirect="~/PageNotFound.aspx" />
</customErrors>
Hepsi mükemmel çalıştı!
Özet:
- Satırı kaldırın:
filters.Add(new HandleErrorAttribute());
Application_Error()
İstisnaları günlüğe kaydetmek için yöntemi kullanın
- Bir ResponseRewrite ile customErrors kullanın, ASPX sayfalarına işaret edin
- ASPX sayfalarını kendi yanıt durum kodlarından sorumlu hale getirin
Bu çözümle fark ettiğim birkaç dezavantaj var.
- ASPX sayfaları, Razor şablonlarıyla herhangi bir biçimlendirmeyi paylaşamaz, tutarlı bir görünüm ve his için web sitemizin standart üstbilgi ve altbilgi biçimlendirmesini yeniden yazmak zorunda kaldım.
- * .Aspx sayfalarına, URL'lerine tıklanarak doğrudan erişilebilir
Bu sorunlar için geçici çözümler var ama ben fazladan iş yapmak için yeterince endişelenmedim.
Umarım bu herkese yardımcı olur!