2009-07-31 29 views
9

tôi có các cài đặt sau trong web.config của tôi:ELMAH lọc không làm việc

<configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
     <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
     <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/> 
    </sectionGroup> 
</configSections> 

<elmah> 
    <security allowRemoteAccess="0" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyConnHere" /> 
</elmah> 

<system.web> 
    <httpHandlers> 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> 
     <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </httpHandlers> 
    <httpModules> 
     <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />    
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/> 
    </httpModules> 
</system.web> 

Và sau đây trong tập tin Global.asax của tôi:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    Filter(e); 
} 

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    Filter(e); 
} 

private void Filter(ExceptionFilterEventArgs e) 
{ 
    var context = e.Context as HttpContext; 

    if (context != null && context.Response.StatusCode == 404) 
     e.Dismiss(); 

    if (e.Exception.GetBaseException() is FileNotFoundException || 
     e.Exception.GetBaseException() is HttpRequestValidationException) 
     e.Dismiss(); 
} 

Tuy nhiên mỗi lần duy nhất, ELMAH logs Ngoại lệ 404. Tôi đang sử dụng ASP.NET MVC; chúng xuất hiện dưới dạng System.Web.HttpException, không phải ngoại lệ FileNotFound, nhưng mã trạng thái vẫn là 404 và vì vậy bộ lọc nên phù hợp, nhưng nó dường như không hoạt động chút nào.

Tôi đang làm gì sai?

+0

Nó chỉ ra rằng mã trạng thái ghi 200 ... tại sao? – Chris

+0

Mã trạng thái phản hồi là 200, nhưng ngoại lệ đọc: "Không thể tìm thấy phương thức hành động công khai 'Register3' trên bộ điều khiển 'controllernamehere'." – Chris

Trả lời

10

Tìm câu trả lời. Phương thức Filter cần kiểm tra kết quả của phương thức HttpException.GetHttpCode(), thay vì kiểm tra thuộc tính Response.StatusCode.

private void Filter(ExceptionFilterEventArgs e) 
{ 
    var exception = e.Exception.GetBaseException(); 
    var httpException = exception as HttpException; 

    if (httpException != null && 
     httpException.GetHttpCode() == 404) 
     e.Dismiss(); 

    if (exception is FileNotFoundException || 
     exception is HttpRequestValidationException || 
     exception is HttpException) 
     e.Dismiss(); 
} 
+0

Cảm ơn vì điều này, tôi đã gặp sự cố tương tự và bài đăng của bạn đã giúp ích. Tuy nhiên, có lẽ tôi đang dày đặc ở đây nhưng sự kết hợp của các câu lệnh sẽ khiến tôi khó hiểu vì thứ hai nếu kiểm tra tất cả các HttpExceptions và loại bỏ vì vậy câu lệnh đầu tiên sẽ vô nghĩa vì ngoại lệ sẽ bị loại bỏ? Cảm ơn Paul –

+0

Paulie, bạn nói đúng. Tôi có lẽ không nên bao gồm HttpException trong câu lệnh if thứ hai, vì tôi chỉ muốn bỏ qua các HttpExceptions cụ thể trong đó mã trạng thái là 404. – Chris

Các vấn đề liên quan