2011-02-17 23 views
17

Global.asax.cs dosyasında HttpRequestValidationException işlemek için bu kod parçasına sahibim.Üretimde HttpRequestValidationException nasıl yakalanır

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 

Web uygulamağumda hata ayıklarsam, mükemmel çalışır. i üretim sunucu üzerine koydu zaman, sunucu bunu yok sayar ve "tehlikeli request.form değeri istemci algılandı" oluşturmak - hata sayfası. Tam ne olduğunu bilmiyorum ... kimse sorunun ne olduğunu, ya da ben yanlış ne biliyorsa ..?

Ayrıca web.config dosyasında validaterequest değerini false olarak ayarlamak istemiyorum.

Sunucu IIS7.5 kullanıyor ve Asp.net 3.5 kullanıyorum.

sayesinde

cevap

10

Tamam Bruno, ben bunu kendime bulundu. Son halimizi temizlemeliyim. Sadece MVC ile çalışır

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     context.Server.ClearError(); // Here is the new line. 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 
+2

"context" varlığına ihtiyacınız olduğunu düşünmüyorum. Sadece "Server.GetLastError()" ve "Server.ClearError()" gibi çalışır. – WildJoe

+0

Response.End() tasarım gereği bir istisna atar. Bunun yerine şu kullanın: 'HttpContext.Current.ApplicationInstance.CompleteRequest'. Açıklama için buna bir göz atın: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end-response-redir – Kamran

4

başka yolu da özel bir durum Filtre kullanıyor:

  • FilterAttribute içinden IExceptionFilter
  • uygulayan özel FilterAttribute oluşturun, kumandanın veya görünüme yönlendirebilirsiniz hatayı görüntülemek için kullanılır.
  • Global.asax filtresi kaydetme veya denetleyicileri

Bu hata görünümünü işlemek için normal bir MVC altyapısını (Ustura) kullanabilir avantajı vardır bağlıyoruz.

public class HttpRequestValidationExceptionAttribute : FilterAttribute, IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 
     if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) { 
      filterContext.Result = new RedirectResult("~/HttpError/HttpRequestValidationError"); 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 
+0

Teşekkürler Paylaşmak için :-) Biraz boş zamanım olduğunda ona bakacağım :-) – bruno

+0

Her zaman bir zevk:> –

+0

Bunun için teşekkürler. Bunu kullandım ama filterContext.ExceptionHandled zaten true olarak ayarlandı, bu yüzden if deyiminde kod çalışmadı ve varsayılan hata sayfam gösterildi. Bu koşulu aldım ve şimdi mükemmel çalışıyor gibi görünüyor. Bunu yapmanın başka yerlerde sorunlara neden olabileceğinden emin değil misiniz ... herhangi bir düşünce? Teşekkürler! – Kate

İlgili konular