Ö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 SqlExceptionoluş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ınHttpApplicationError 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.aspxtı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.SqlExceptiontürü de listelenir. Ayrıca yığın izlemesi de vardır.

Özel durum hakkındaki bilgileri içeren YSOD özel durum ayrıntılarını gösteren ekran görüntüsü.

Ş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> .

YSOD çalışma zamanı hatasının herhangi bir hata ayrıntısı içermediğini gösteren ekran görüntüsü.

Ş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.

Daha özel bir görünüm ve hissi gösteren özel hata sayfasını gösteren ekran görüntüsü.

Ş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, Offveya 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.aspxyeni 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.

Yeni ErrorPages klasörünü ve ilişkili Oops dot a s p x dosyasını vurgulayan ekran görüntüsü.

Ş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.

Özel hata sayfasını ve ilişkili iletiyi gösteren ekran görüntüsü.

Ş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 HttpExceptionoluş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.aspxaspxerrorpath dikkat edin).

A S P nokta NET çalışma zamanının yapılandırılan hata sayfasını nasıl görüntülediğini gösteren ekran görüntüsü.

Ş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.aspxyönlendirilir404.aspx. Şekil 7'de gösterildiği gibi, 404.aspx sayfa genel özel hata sayfasından daha belirgin bir ileti içerebilir.

Özel 4 O 4 hata sayfasını gösteren ekran görüntüsü.

Ş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: