Özel Hata Sayfası Görüntüleme (C#)
tarafından Scott Mitchell
ASP.NET web uygulamasında çalışma zamanı hatası oluştuğunda kullanıcı ne görür? Yanıt, web sitesinin <customErrors> yapılandırmasına bağlıdır. Varsayılan olarak, kullanıcılara bir çalışma zamanı hatası oluştuğu bildirilmiş, çirkin bir sarı ekran gösterilir. Bu öğreticide, sitenizin görünüm ve hissine uyan estetik açıdan hoş bir özel hata sayfası görüntülemek için bu ayarların nasıl özelleştirileceği gösterilmektedir.
Giriş
Mükemmel bir dünyada çalışma zamanı hataları olmaz. Programcılar bir hatayla ve güçlü kullanıcı girişi doğrulamasıyla kod yazar ve veritabanı sunucuları ve e-posta sunucuları gibi dış kaynaklar hiçbir zaman çevrimdışı olmaz. Elbette, gerçekte hatalar kaçınılmazdır. .NET Framework sınıflar özel durum oluşturarak hata sinyali veriyor. Örneğin, bir SqlConnection nesnesinin Open yöntemini çağırmak, bir bağlantı dizesi tarafından belirtilen veritabanına bir bağlantı oluşturur. Ancak veritabanı çalışmıyorsa veya bağlantı dizesindeki kimlik bilgileri geçersizse Open yöntemi bir SqlException
oluşturur. Özel durumlar blokların kullanımıyla try/catch/finally
işlenebilir. Blok try
içindeki kod bir özel durum oluşturursa, denetim geliştiricinin hatadan kurtarmayı deneyebileceği uygun catch bloğuna aktarılır. Eşleşen catch bloğu yoksa veya özel durumu oluşturan kod bir deneme bloğunda değilse, özel durum blok aramasında çağrı yığınını try/catch/finally
bir araya toplar.
Özel durum işlenmeden ASP.NET çalışma zamanına kadar kabarırsa, sınıfınHttpApplication
Error
olayı oluşturulur ve yapılandırılan hata sayfası görüntülenir. Varsayılan olarak, ASP.NET sevgiyle Ölüm Sarı Ekranı (YSOD) olarak adlandırılan bir hata sayfası görüntüler. YSOD'nin iki sürümü vardır: biri özel durum ayrıntılarını, bir yığın izlemesini ve uygulamada hata ayıklayan geliştiricilere yardımcı olan diğer bilgileri gösterir (bkz . Şekil 1); diğeri yalnızca bir çalışma zamanı hatası olduğunu belirtir (bkz . Şekil 2).
Özel durum ayrıntıları YSOD, geliştiricilerin uygulamada hata ayıklaması için oldukça yararlıdır, ancak son kullanıcılara bir YSOD göstermek basit ve profesyonel değildir. Bunun yerine, son kullanıcılar sitenin görünümünü ve hissini koruyan bir hata sayfasına alınmalıdır ve durumu daha kullanıcı dostu bir yordamla açıklanmalıdır. İyi haber, böyle bir özel hata sayfası oluşturmanın oldukça kolay olmasıdır. Bu öğretici, ASP'ye bir göz atarak başlar. NET'in farklı hata sayfaları. Daha sonra web uygulamasının kullanıcılara hata karşısında özel bir hata sayfası gösterecek şekilde nasıl yapılandırılağını gösterir.
Üç Tür Hata Sayfasını inceleme
bir ASP.NET uygulamasında işlenmeyen bir özel durum ortaya çıktığında üç tür hata sayfasından biri görüntülenir:
- Özel Durum Ayrıntıları Sarı Ölüm Ekranı hata sayfası,
- Çalışma Zamanı Hatası Sarı Ölüm Ekranı hata sayfası veya
- Özel hata sayfası
Geliştiricilerin en çok tanıdığı hata sayfası Özel Durum Ayrıntıları YSOD'dir. Varsayılan olarak, bu sayfa yerel olarak ziyaret eden kullanıcılara görüntülenir ve bu nedenle geliştirme ortamında site test edilirken bir hata oluştuğunda gördüğünüz sayfadır. Adından da anlaşılacağı gibi, Özel Durum Ayrıntıları YSOD özel durum hakkında ayrıntılar sağlar: tür, ileti ve yığın izlemesi. Dahası, özel durum ASP.NET sayfanızın arkadaki kod sınıfındaki kod tarafından oluşturulduysa ve uygulama hata ayıklama için yapılandırıldıysa, Özel Durum Ayrıntıları YSOD bu kod satırını da gösterir (ve bunun üzerinde ve altında birkaç kod satırı bulunur).
Şekil 1'de Özel Durum Ayrıntıları YSOD sayfası gösterilmektedir. Tarayıcının adres penceresindeki URL'ye dikkat edin: http://localhost:62275/Genre.aspx?ID=foo
. Sayfada belirli bir türdeki kitap incelemelerinin listelendiğini Genre.aspx
hatırlayın. (auniqueidentifier
) değerinin GenreId
querystring üzerinden geçirilmesini gerektirir; örneğin kurgu incelemelerini görüntülemek için uygun URL şeklindedirGenre.aspx?ID=7683ab5d-4589-4f03-a139-1c26044d0146
. Querystring ("foo" gibi) aracılığıyla değer olmayanuniqueidentifier
bir değer geçirilirse bir özel durum oluşturulur.
Not
İndirilebilecek tanıtım web uygulamasında bu hatayı yeniden oluşturmak için doğrudan adresini ziyaret Genre.aspx?ID=foo
edebilir veya içindeki "Çalışma Zamanı Hatası Oluştur" bağlantısına Default.aspx
tıklayabilirsiniz.
Şekil 1'de sunulan özel durum bilgilerine dikkat edin. Sayfanın üst kısmında "Bir karakter dizesinden uniqueidentifier'a dönüştürülürken dönüştürme başarısız oldu" özel durum iletisi bulunur. Özel durumun System.Data.SqlClient.SqlException
türü de listelenir. Ayrıca yığın izlemesi de vardır.
Şekil 1: Özel Durum Ayrıntıları YSOD Özel Durum Hakkında Bilgi Içerir
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Diğer YSOD türü, Çalışma Zamanı Hatası YSOD'dir ve Şekil 2'de gösterilir. Çalışma Zamanı Hatası YSOD, ziyaretçiye bir çalışma zamanı hatası oluştuğunu bildirir, ancak oluşan özel durum hakkında herhangi bir bilgi içermez. (Ancak, bu tür bir YSOD'nin profesyonel görünmemesini sağlayan şeyin bir parçası olan dosyayı değiştirerek Web.config
hata ayrıntılarının nasıl görüntülenebilir hale getirileceğine ilişkin yönergeler sağlar.)
Varsayılan olarak Çalışma Zamanı Hatası YSOD, tarayıcının Şekil 2'deki Adres çubuğundaki URL'de gösterildiği gibi uzaktan (aracılığıylahttp://www.yoursite.com) ziyaret eden kullanıcılara gösterilir: http://httpruntime.web703.discountasp.net/Genre.aspx?ID=foo
. Geliştiriciler hata ayrıntılarını bilmekle ilgilendiğinden iki farklı YSOD ekranı vardır, ancak bu tür bilgiler sitenizi ziyaret eden herkese olası güvenlik açıklarını veya diğer hassas bilgileri ortaya çıkarabileceğinden canlı bir sitede gösterilmemelidir.
Not
Takip ediyorsanız ve web barındırma sağlayıcınız olarak DiscountASP.NET kullanıyorsanız, canlı siteyi ziyaret ederken Çalışma Zamanı Hatası YSOD'nin görüntülenmediğini fark edebilirsiniz. Bunun nedeni, DiscountASP.NET sunucularının varsayılan olarak Özel Durum Ayrıntıları YSOD'sini gösterecek şekilde yapılandırılmış olmasıdır. İyi haber, dosyanıza Web.config
bir <customErrors>
bölüm ekleyerek bu varsayılan davranışı geçersiz kılabilmenizdir. "Hangi Hata Sayfasının Görüntüleneceğini Yapılandırma" bölümü bölümü ayrıntılı olarak inceler <customErrors>
.
Şekil 2: Çalışma Zamanı Hatası YSOD herhangi bir hata ayrıntısı içermiyor
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Üçüncü hata sayfası türü, oluşturduğunuz bir web sayfası olan özel hata sayfasıdır. Özel hata sayfasının avantajı, kullanıcıya görüntülenen bilgiler üzerinde sayfanın görünümü ve hissi ile birlikte tam denetime sahip olmanızdır; özel hata sayfası, diğer sayfalarınızla aynı ana sayfayı ve stilleri kullanabilir. "Özel Hata Sayfası Kullanma" bölümü, özel hata sayfası oluşturma ve işlenmeyen bir özel durum durumunda görüntülenecek şekilde yapılandırma adımlarını gösterir. Şekil 3'te bu özel hata sayfasının en üst noktası gösterilmektedir. Gördüğünüz gibi, hata sayfasının görünümü ve hissi, Şekil 1 ve 2'de gösterilen Sarı Ölüm Ekranlarından herhangi birinden çok daha profesyonel görünümlüdür.
Şekil 3: Özel Hata Sayfası Daha Özel Bir Görünüm ve Görünüm Sunar
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 3'te tarayıcının Adres çubuğunu incelemek için biraz zaman ayırın. Adres çubuğunda özel hata sayfasının (/ErrorPages/Oops.aspx
) URL'sinin gösterildiğini unutmayın. Şekil 1 ve 2'de Sarı Ölüm Ekranları, hatanın ( kaynağıylaGenre.aspx
aynı sayfada gösterilir. Özel hata sayfasına, querystring parametresi aracılığıyla hatanın oluştuğu sayfanın URL'si aspxerrorpath
geçirilir.
Hangi Hata Sayfasının Görüntüleneceğini Yapılandırma
Görüntülenen üç olası hata sayfasından hangisi iki değişkeni temel alır:
- bölümündeki yapılandırma bilgileri
<customErrors>
ve - Kullanıcının siteyi yerel olarak veya uzaktan ziyaret edip etmediği.
<customErrors>
içindeki Web.config
bölümünde hangi hata sayfasının gösterildiğini etkileyen iki öznitelik vardır: defaultRedirect
ve mode
. defaultRedirect
özniteliği isteğe bağlıdır. Sağlanırsa, özel hata sayfasının URL'sini belirtir ve Çalışma Zamanı Hatası YSOD yerine özel hata sayfasının gösterilmesi gerektiğini belirtir. mode
özniteliği gereklidir ve üç değerden birini kabul eder: On
, Off
veya RemoteOnly
. Bu değerler aşağıdaki davranışa sahiptir:
On
- özel hata sayfasının veya Çalışma Zamanı Hatası YSOD'nin yerel veya uzak olmasına bakılmaksızın tüm ziyaretçilere gösterildiğini gösterir.Off
- Özel Durum Ayrıntıları YSOD'sinin yerel veya uzak olmasına bakılmaksızın tüm ziyaretçilere görüntüleneceğini belirtir.RemoteOnly
- özel hata sayfasının veya Çalışma Zamanı Hatası YSOD'nin uzak ziyaretçilere, Özel Durum Ayrıntıları YSOD'sinin ise yerel ziyaretçilere gösterildiğini gösterir.
Aksini belirtmediğiniz sürece, ASP.NET mode özniteliğini RemoteOnly
olarak ayarlamış ve bir defaultRedirect
değer belirtmemişsiniz gibi davranır. Başka bir deyişle varsayılan davranış, Özel Durum Ayrıntıları YSOD'sinin yerel ziyaretçilere görüntülenmesi ve Çalışma Zamanı Hatası YSOD'nin uzak ziyaretçilere gösterilmesidir. Web uygulamanızın uygulamasına bir <customErrors>
bölüm ekleyerek bu varsayılan davranışı geçersiz kılabilirsiniz Web.config file.
Özel Hata Sayfası Kullanma
Her web uygulamasının özel bir hata sayfası olmalıdır. Çalışma Zamanı Hatası YSOD'ye daha profesyonel görünümlü bir alternatif sağlar, oluşturulması kolaydır ve uygulamayı özel hata sayfasını kullanacak şekilde yapılandırmak yalnızca birkaç dakika sürer. İlk adım, özel hata sayfasını oluşturmaktır. Kitap İncelemeleri uygulamasına adlı ErrorPages
yeni bir klasör ekledim ve bu klasöre adlı Oops.aspx
yeni bir ASP.NET sayfası ekledim. Sayfanın sitenizdeki sayfaların geri kalanıyla aynı ana sayfayı kullanmasını sağlayın, böylece aynı genel görünümü otomatik olarak devralır.
Şekil 4: Özel Hata Sayfası Oluşturma
Ardından, hata sayfasının içeriğini oluşturmak için birkaç dakikanızı ayırın. Beklenmeyen bir hata olduğunu ve sitenin giriş sayfasına bir bağlantı olduğunu belirten bir ileti içeren oldukça basit bir özel hata sayfası oluşturdum.
Şekil 5: Özel Hata Sayfanızı Tasarlama
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Hata sayfası tamamlandığında, web uygulamasını Çalışma Zamanı Hatası YSOD yerine özel hata sayfasını kullanacak şekilde yapılandırın. Bu, bölümün özniteliğinde hata sayfasının URL'si <customErrors>
defaultRedirect
belirtilerek gerçekleştirilir. Uygulamanızın Web.config
dosyasına aşağıdaki işaretlemeyi ekleyin:
<configuration>
...
<system.web>
<customErrors mode="RemoteOnly"
defaultRedirect="~/ErrorPages/Oops.aspx" />
...
</system.web>
</configuration>
Yukarıdaki işaretleme, uygulamayı yerel olarak ziyaret eden kullanıcılara Özel Durum Ayrıntıları YSOD'sini gösterecek şekilde yapılandırırken, uzaktan ziyaret eden kullanıcılar için Oops.aspx özel hata sayfasını kullanıyor. Bunu uygulamada görmek için, web sitenizi üretim ortamına dağıtın ve ardından geçersiz bir querystring değeriyle canlı sitedeki Genre.aspx sayfasını ziyaret edin. Özel hata sayfasını görmeniz gerekir ( Şekil 3'e geri bakın).
Özel hata sayfasının yalnızca uzak kullanıcılara gösterildiğini doğrulamak için, geliştirme ortamından geçersiz sorgu dizesi içeren sayfayı ziyaret edin Genre.aspx
. Özel Durum Ayrıntıları YSOD'sini görmeye devam etmelisiniz ( Şekil 1'e geri bakın). Bu RemoteOnly
ayar, üretim ortamında siteyi ziyaret eden kullanıcıların özel hata sayfasını görmesini sağlarken, yerel olarak çalışan geliştiriciler özel durumun ayrıntılarını görmeye devam eder.
Geliştiricilere Bildirme ve Hata Ayrıntılarını Günlüğe Kaydetme
Geliştirme ortamında oluşan hatalar, geliştiricinin bilgisayarında oturması nedeniyle oluştu. Özel Durum Ayrıntıları YSOD'sinde özel durumun bilgileri gösterilir ve hata oluştuğunda hangi adımları gerçekleştirdiğini bilir. Ancak üretimde bir hata oluştuğunda geliştirici, siteyi ziyaret eden son kullanıcının hatayı bildirmesi için zaman ayırmadığı sürece bir hata oluştuğundan haberi olmaz. Ayrıca kullanıcı, özel durum türünü, iletiyi ve yığın izlemesini bilmeden geliştirme ekibini hata oluştuğu konusunda uyarmak için yolunun dışına çıksa bile, hatayı düzeltmeyi bırak, hatanın nedenini tanılamak zor olabilir.
Bu nedenlerden dolayı üretim ortamındaki herhangi bir hatanın kalıcı bir depoya (veritabanı gibi) günlüğe kaydedilmesi ve geliştiricilerin bu hatayla ilgili uyarılması çok önemlidir. Özel hata sayfası bu günlüğü ve bildirimi yapmak için iyi bir yer gibi görünebilir. Ne yazık ki, özel hata sayfasının hata ayrıntılarına erişimi yoktur ve bu nedenle bu bilgileri günlüğe kaydetmek için kullanılamaz. İyi haber, hata ayrıntılarını kesmenin ve günlüğe kaydetmenin çeşitli yolları vardır ve sonraki üç öğreticide bu konu daha ayrıntılı olarak incelenir.
Farklı HTTP Hata Durumları için Farklı Özel Hata Sayfaları Kullanma
Bir ASP.NET sayfası tarafından özel durum oluşturulduğunda ve işlenmediğinde, özel durum yapılandırılan hata sayfasını görüntüleyen ASP.NET çalışma zamanına kadar geçerlidir. İstek ASP.NET altyapısına gelirse ancak herhangi bir nedenle işlenemediyse (istenen dosya bulunamadıysa veya dosya için Okuma izinleri devre dışı bırakıldıysa) ASP.NET altyapısı bir HttpException
oluşturur. Bu özel durum, ASP.NET sayfalardan oluşturulan özel durumlar gibi çalışma zamanına kadar kabarcıklar oluşturur ve uygun hata sayfasının görüntülenmesine neden olur.
Bunun üretimdeki web uygulaması için anlamı, bir kullanıcı bulunamaz bir sayfa isterse özel hata sayfasını görmesidir. Şekil 6'da böyle bir örnek gösterilmektedir. İstek var olmayan bir sayfaya ()NoSuchPage.aspx
yönelik olduğundan, bir HttpException
oluşturulur ve özel hata sayfası görüntülenir (querystring parametresinde başvurusuna NoSuchPage.aspx
aspxerrorpath
dikkat edin).
Şekil 6: ASP.NET Çalışma Zamanı Geçersiz bir İsteğe Yanıt Olarak Yapılandırılan Hata Sayfasını Görüntüler (tam boyutlu görüntüyü görüntülemek için tıklayın)
Varsayılan olarak, tüm hata türleri aynı özel hata sayfasının görüntülenmesine neden olur. Ancak, bölümdeki <customErrors>
alt öğeleri kullanarak <error>
belirli bir HTTP durum kodu için farklı bir özel hata sayfası belirtebilirsiniz. Örneğin, HTTP durum kodu 404 olan bir sayfanın bulunamadı hatası durumunda farklı bir hata sayfası görüntülenmesi için, bölümü aşağıdaki işaretlemeyi içerecek şekilde güncelleştirin <customErrors>
:
<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/Oops.aspx">
<error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>
Bu değişiklik gerçekleştiğinde, uzaktan ziyaret eden bir kullanıcı var olmayan bir ASP.NET kaynağı istediğinde, yerine özel hata sayfasına Oops.aspx
yönlendirilir404.aspx
. Şekil 7'de gösterildiği gibi, 404.aspx
sayfa genel özel hata sayfasından daha belirgin bir ileti içerebilir.
Not
Etkin 404 hata sayfaları oluşturma yönergeleri için 404 Hata Sayfaları, Bir Kez Daha bölümüne göz atın.
Şekil 7: Özel 404 Hata Sayfası Oops.aspx
(Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sayfaya 404.aspx
yalnızca kullanıcı bulunamadı bir sayfa için istekte bulunduğunda ulaşıldığını bildiğinizden, bu özel hata sayfasını, kullanıcının bu tür bir hatayı ele almasına yardımcı olacak işlevleri içerecek şekilde geliştirebilirsiniz. Örneğin, bilinen hatalı URL'leri iyi URL'lerle eşleyen bir veritabanı tablosu oluşturabilir ve ardından 404.aspx
özel hata sayfasının bu tabloda bir sorgu çalıştırmasını ve kullanıcının ulaşmaya çalıştığı sayfaları önermesini sağlayabilirsiniz.
Not
Özel hata sayfası yalnızca ASP.NET altyapısı tarafından işlenen bir kaynağa istek yapıldığında görüntülenir. IIS ile ASP.NET Geliştirme Sunucusu Arasındaki Temel Farklar öğreticisinde ele aldığımız gibi, web sunucusu belirli isteklerin kendisini işleyebilir. Varsayılan olarak, IIS web sunucusu ASP.NET altyapısını çağırmadan görüntüler ve HTML dosyaları gibi statik içerik isteklerini işler. Sonuç olarak, kullanıcı mevcut olmayan bir görüntü dosyası isterse, ASP yerine IIS'nin varsayılan 404 hata iletisini geri alır. NET'in yapılandırılmış hata sayfası.
Özet
ASP.NET bir uygulamada işlenmeyen bir özel durum oluştuğunda kullanıcıya üç hata sayfasından biri gösterilir: Özel Durum Ayrıntıları Sarı Ölüm Ekranı; Ölüm Çalışma Zamanı Hatası Sarı Ekranı; veya özel bir hata sayfası. Hangi hata sayfasının görüntüleneceği uygulamanın <customErrors>
yapılandırmasına ve kullanıcının yerel olarak mı yoksa uzaktan mı ziyaret ettiğine bağlıdır. Varsayılan davranış, yerel ziyaretçilere Özel Durum Ayrıntıları YSOD'sini ve uzak ziyaretçilere Çalışma Zamanı Hatası YSOD'yi göstermektir.
Çalışma Zamanı Hatası YSOD, siteyi ziyaret eden kullanıcıdan hassas olabilecek hata bilgilerini gizlese de, sitenizin görünüm ve hissi bozulur ve uygulamanızın karmaşık görünmesini sağlar. Daha iyi bir yaklaşım, özel hata sayfası oluşturup tasarlamayı ve bölümün defaultRedirect
özniteliğinde URL'sini belirtmeyi kapsayan <customErrors>
özel bir hata sayfası kullanmaktır. Farklı HTTP hata durumları için birden çok özel hata sayfanız bile olabilir.
Özel hata sayfası, üretimdeki bir web sitesi için kapsamlı bir hata işleme stratejisinin ilk adımıdır. Geliştiriciyi hata konusunda uyarmak ve ayrıntılarını günlüğe kaydetmek de önemli adımlardır. Sonraki üç öğreticide hata bildirimi ve günlüğe kaydetme teknikleri inceler.
Mutlu Programlama!
Daha Fazla Bilgi
Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: