IIS7 Response.StatusCode'u ayarlarken customErrors'ı geçersiz kılar?


98

Burada garip bir problem yaşıyorum. Herkes bilir ki, customErrorsözel bir hata sayfası oluşturmak için web.config bölümünü kullanırsanız Response.StatusCode, uygun olanı ayarlamanız gerekir . Örneğin, özel bir 404 sayfası yapıp 404.aspx olarak adlandırırsam, <% Response.StatusCode = 404 %>gerçek bir 404 durum başlığına sahip olması için içeriği ekleyebilirim.

Şimdiye kadar beni takip ediyor musun? İyi. Şimdi bunu IIS7'de yapmayı deneyin. Çalışmasını sağlayamıyorum, nokta. Eğer Response.StatusCodeözel hata sayfası yer almakta olup IIS7 tamamen özel bir hata sayfası geçersiz görünüyor ve kendi durum sayfası gösterir (eğer yapılandırılmış varsa.)

Başka biri bu davranışı gördü ve belki de bunun üzerinden nasıl geçileceğini biliyor mu? IIS6 altında çalışıyordu, bu yüzden işlerin neden değiştiğini bilmiyorum.

Not: Bu, ASP.NET Özel 404 404 Bulunamadı Yerine 200 Tamam Dönüyor'daki sorunla aynı değildir



Bobby, aslında bu soruyu buldum ve denedim ama sorunu çözmedi. Ama teşekkürler.
Nicholas

Bu sorunun, Klasikten Entegre boru hattına geçerken de ortaya çıktığını yorumlamak isterim. @PavelChuchuva çözümünü kullandım (@RickStrahl çözümü de çalışıyor). Classic'teki "geçiş" in otomatik olduğunu tahmin ediyorum, Integrated'da sunucunun genel hata sayfası işlemesini alıyor ..
sonjz

Yanıtlar:


116

System.webServer / httpErrors bölümünde mevcutResponse'yi PassThrough olarak ayarlayın:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

MevcutResponse özelliğinin varsayılan değeri Otomatik'tir:

Otomatik, özel hata modülüne doğru şeyi yapmasını söyler . İstemciler tarafından görülen gerçek hata metni, çağrıda döndürülen f TrySkipCustomErrors değerine bağlı olarak etkilenecektir IHttpResponse::GetStatus. F TrySkipCustomErrors değeri true olarak ayarlandığında, özel hata modülü yanıtın geçmesine izin verir, ancak false olarak ayarlanırsa, özel hatalar modülü metni kendi metniyle değiştirir.

Daha fazla bilgi: IIS7 özel hata modülünden ne beklenebilir


3
MevcutResponse'u PassThrough olarak ayarlamanın bazı yan etkilere yol açabileceğini unutmayın. Lütfen herhangi bir değişiklikten önce Pavel tarafından sağlanan bağlantıda ustalaşın.
Lex Li

<httpErrors existingResponse="PassThrough" />denk Response.TrySkipIisCustomErrorsya da farklı davranabilir mi?
Asbjørn Ulsberg

1
@sbjornu Aynı şeyi başarırlar ancak Response.TrySkipIisCustomErrorsIIS özel hatalarının ne zaman görüntüleneceğini daha iyi kontrol edebilirsiniz.
Pavel Chuchuva

teşekkür ederim, response.tryskipiiscustomerrors hakkında çok fazla bilgi gördüm, ancak mevcut yanıt hakkında pek bir şey görmedim.
HBCondo

IIS7 çalıştıran web sunucumda çalışmayan özel hata sayfalarıyla ilgili bir sorunu, yalnızca varolanResponse = "Otomatik" ayarını yaparak çözdüm, bu da makale varsayılan iddialara atıfta bulunduğundan çok şaşırtıcıydı. Açıkça değil ... ya da barındırma şirketim başka bir yerde yanlış varsayılanı ayarladı, sanırım. Her iki durumda da bu birisini birkaç saat kurtarır umarım: \
Eric Sassaman

80

Davranışı tutarlı hale getirmenin en kolay yolu, hatayı gidermek ve Response. TrySkipIisCustomErrors'ı kullanmak ve bunu true olarak ayarlamaktır. Bu, sayfanızdaki IIS genel hata sayfası işlemesini veya Application_Error'daki genel hata işleyicisini geçersiz kılacaktır.

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

Genellikle bunu, uygulama hata işleyicilerinizin yakalamadığı tüm hataları işleyen Application_Error işleyicinizde yapmanız gerekir.

Bu blog gönderisinde daha ayrıntılı bilgi bulunabilir: http://www.west-wind.com/weblog/posts/745738.aspx


2
Bu benim için de işe yaramıyor (IIS8) ve tavsiye OP ile uyuşmuyor (doğru okuduğumu varsayarsak). Ben istiyorumcustomError tetikleyici için Web.config yapılandırılmış. İle Response.TrySkipIisCustomErrors = trueaynı davranışı görüyorum: Sunucu tarafından oluşturulan çirkin hata sayfası görüntüleniyor. Yönelik olarak ayarlayın ile falsehiçbir şey olmuyor - Boş bir tarayıcı penceresi.
Shawn South

Benim için iyi çalıştı! Pavel Chuchuva'nın cevabında bahsettiği ortam da işe yarasa da, başka sorunlara neden olan bazı yan etkilere sahipti. Bu ayar, istediğim belirli senaryoda IIS hatasını geçersiz kılmayı atlamama izin verirken, diğer her şey için davranışı olduğu gibi bırakıyor.
Kevin Tighe

Benim için Azure'da iyi çalıştı. Sunucu başlıklarıServer:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
oxfn

Hala customErrors mode="Off"bunun işe yaraması için ayarlamam gerektiğini düşünüyorum . Bunu yaparsam, bu yanıtta kodu kullandığımda httpErrors mevcutResponse = "Otomatik" (varsayılan) benim için düzgün çalışıyor.
AaronLS

11

Çözüldü: IIS7'nin sahip olabileceğiniz herhangi bir hata sayfasını "geçerek" geçmesi için "Ayrıntılı Hatalar" ın açık olması gerektiği ortaya çıktı. Bkz. Http://forums.iis.net/t/1146653.aspx


1
Bu cevap olarak işaretlenmiş olsa da, konuyla ilgili daha fazla bilgi edinmek için diğer yanıtları okumaya değer olduğunu düşünüyorum.
Lex Li

Ayrıca çıkarmak iyi olabilir. FilterConfig'de HandleErrorAttribute
G için

4

Bunun doğası gereği benzer olup olmadığından emin değilim, ancak yüzeyde benzer görünen bir sorunu çözdüm ve işte bu şekilde ele aldım.

Her şeyden önce, benim durumumda mevcut Yanıt (Otomatik) için varsayılan değer doğru yanıttı, çünkü özel bir 404, 400 ve 500'e sahibim (başkalarını da oluşturabilirim, ancak bu üçü yaptığım şey için yeterli olacaktır). İşte bana yardımcı olan ilgili bölümler.

Web.config'den:

<customErrors mode="Off" />

Ve

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

Oradan bunu global.asax üzerindeki Application_Error'a ekledim:

    Response.TrySkipIisCustomErrors = True

Özel hata sayfalarımın her birine doğru yanıt durum kodunu eklemem gerekiyordu. Benim durumumda, ben o yüzden sitemde farklı bölümlerine, kullanıcıları için özel bir 404 kullanıyorum yok aslında ölü sayfası olmadıkça 404 durum kodu döndürdü istiyorum.

Her neyse, ben böyle yaptım. Umarım bu birine yardımcı olur.


3

Bu sorun büyük bir baş ağrısıydı. Daha önce bahsedilen önerilerin hiçbiri tek başına çözmedi, bu yüzden çözümümü ekliyorum. Kayıt için, ortamımız / platformumuz şunları kullanır:

  • .Net çerçeve 4
  • MVC 3
  • IIS8 (iş istasyonu) ve IIS7 (web sunucusu)

Özellikle, kullanıcıyı özel 404 sayfamıza (Web.config ayarları aracılığıyla) yeniden yönlendirecek bir HTTP 404 yanıtı almaya çalışıyordum.

İlk olarak, kodumun bir HttpException. NotFoundResultDenetleyiciden a döndürmek , peşinde olduğum sonuçları elde etmedi.

throw new HttpException(404, "There is no class with that subject");

Sonra yapılandırmak zorunda kaldı hemcustomErrors ve httpErrorWeb.config düğümler.

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

@Sefl'in sunduğu çözümden farklı olan existingResponseolarak bıraktığımı unutmayın Auto.

customErrorsAyarlar benim açıkça atılan işlemek için gerekli olduğu ortaya çıktı HttpExceptioniken, httpErrorsdüğüm Globals.asax.cs belirtilen güzergah kalıplarının dışına çıktığını URL'ler ele.

PS Bu ayarlarla ayarlamama gerek yoktu Response.TrySkipIisCustomErrors


2

TrySkipIisCustomErrorssadece bir bulmacanın bir parçasıdır. Özel Hata Sayfaları kullanıyorsanız, ancak aynı zamanda 4xx durumlarına göre RESTful içerik sağlamak istiyorsanız, bir sorununuz var demektir. Web.config'in httpErrors.existingResponse ayarını "Otomatik" olarak ayarlamak işe yaramıyor, çünkü .net her zaman bazı sayfa içeriğini IIS'ye veriyor gibi görünüyor, bu nedenle "Otomatik" seçeneğinin kullanılması tüm (veya en azından bazı) Özel Hata Sayfalarının kullanılmamasına neden oluyor. Yanıt http durum kodunuzu içereceğinden, ancak içeriği boş veya Özel Hata Sayfası ile doldurulacağından "Değiştir" seçeneğini kullanmak da işe yaramaz. Ve "Geçiş" aslında CEP'i kapatır, bu nedenle kullanılamaz.

Bu nedenle, bazı durumlarda CEP'i atlamak istiyorsanız (atlayarak 4xx durumunu bazı içeriklerle döndürmek demek istiyorum) ek adıma ihtiyacınız olacak: hatayı temizleyin:

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

Dolayısıyla, REST yanıtını (ör. 400 - Kötü İstek) kullanmak ve onunla birlikte bazı içerik göndermek istiyorsanız, web.config'deki httpErrors bölümünde TrySkipIisCustomErrorseylemde bir yeri ayarlamanız existingResponseve "Otomatik" olarak ayarlamanız gerekir. Şimdi:

  • hata olmadığında (eylem 4xx veya 5xx döndürür) ve bir miktar içerik döndürüldüğünde, CEP kullanılmaz ve içerik istemciye aktarılır;
  • bir hata olduğunda (bir istisna atıldığında), hata işleyiciler tarafından döndürülen içerik kaldırılır, bu nedenle CEP kullanılır.

Eyleminizden boş içerikle durumu döndürmek istiyorsanız, bu boş bir yanıt olarak kabul edilecek ve CEP gösterilecektir, bu nedenle bu kodu geliştirmek için biraz yer vardır.


0

Varsayılan olarak IIS 7, ayrıntılı özel hata iletileri kullanır, bu nedenle Response.StatusCode'un 404 yerine 404.XX'e eşit olacağını varsayıyorum.

IIS7'yi, daha basit hata mesajı kodlarını kullanacak veya IIS7'nin sunduğu daha ayrıntılı hata mesajlarını işleyen kodunuzu değiştirecek şekilde yapılandırabilirsiniz.

Daha fazla bilgiyi burada bulabilirsiniz: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-entive-custom-error-pages.aspx

Daha fazla araştırma, yanlış bir şekilde yaptığımı ortaya çıkardı - ayrıntılı mesajlar varsayılan olarak değildir, ancak bahsettiğiniz farklı hata mesajlarını görüyorsanız kutunuzda açılmış olabilirler.


Response.StatusCode bir tamsayıdır, bu yüzden sadece "404" ten daha özel bir kod ayarlamanın bir yolunu görmüyorum. URL'nizin belirttiği gibi özel hata sayfalarını kullanmak / göstermek için yapılandırılmış IIS7 var.
Nicholas

Hmmm ... Maalesef şu anda ev bilgisayarımda olmadığım için test edemiyorum. O zamana kadar bir çözüm bulamazsanız - bu gece bir göz atacağım.
nullnvoid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.