2009-04-17 27 views
8

Tôi nhận thấy trong hộp mà ELMAH ghi nhật ký 404 không tìm thấy cho favico trên máy chủ cục bộ của tôi. Làm cách nào để loại bỏ lỗi này thông qua bộ lọc? Tôi không quá quen thuộc với việc định cấu hình nó ..Chặn lỗi 404 FavIco trong ELMAh

Trả lời

18

Elmah chính thức Error Filtering page giải thích một số cách mà lỗi favicon 404 này có thể bị chặn lại.

Bạn có thể lọc ra tất cả lỗi 404 trong web.config như vậy. Tôi không chắc chắn có một cách để chỉ surpress một 404 cho một favicon mặc dù.

<errorFilter> 
    <test> 
     <equal binding="HttpStatusCode" value="404" type="Int32" /> 
    </test> 
</errorFilter> 

Nếu bạn muốn thực hiện theo chương trình, bạn có thể loại bỏ lỗi trong sự kiện lọc ErrorLog hoặc ErrorEmail như được giải thích trong tài liệu chính thức. Mã dưới đây hơi quá mức, nhưng nó thể hiện cách bạn có thể lọc ra chỉ lỗi 404 cho yêu cầu /favicon.ico.

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404 
     && ((HttpContext)e.Context).Request.Path == "/favicon.ico") 
    { 
     e.Dismiss(); 
    } 
} 

Cá nhân tôi muốn lọc tất cả 404 khai báo thông qua web.config hoặc chỉ cung cấp một biểu tượng như Joel đề xuất.

+0

Điều này sẽ thực hiện công việc, nhưng tôi không khuyên bạn nên lọc * tất cả * 404 lỗi. Đó là loại hạn chế sức mạnh của ELMAH. Tôi thích ủng hộ cách tiếp cận của Joel nơi bạn thực sự * sửa lỗi *. – senfo

+2

loL! Tôi chỉ đi .. oh yea Tôi chỉ có thể thêm một favicon! – gideon

13

Nó không giúp bạn tìm hiểu cách định cấu hình ELMAH, nhưng cách dễ nhất để ngăn chặn 404 cho yêu cầu cho favicon là cung cấp một ...

2

tôi chỉ bỏ qua tuyến đường thay vì định cấu hình Elmah. Điều này phù hợp với tôi:

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}); 
+1

Bạn có chắc chắn đã thực sự kiểm tra điều này với ELMAH không? Bỏ qua tuyến đường không hoạt động. Nó chỉ làm cho yêu cầu bị bỏ qua bởi MVC và truyền vào đường dẫn ASP.NET thông thường mà 404s nó, gây ra để được đăng nhập vào ELMAH. –

+0

Đã một thời gian kể từ khi tôi xem mã đó, vì vậy tôi cần phải kiểm tra kỹ, nhưng tôi đã sử dụng kỹ thuật này trên một trang web trực tiếp và dường như nó hoạt động cho tôi. Có một sự khác biệt giữa IIS6 và IIS7? – Junto

+0

Có hay không bạn cần nó phụ thuộc vào cấu hình máy chủ. Đối với Cassini (Visual Studio gỡ lỗi), những 404 được đăng nhập bởi Elmah. Đối với IIS 6, Elmah không nhìn thấy chúng nếu chúng bị bỏ qua bằng cách định tuyến. Tôi đã không thử nghiệm IIS 7. –

1

Tôi đã sử dụng giải pháp lập trình của Kurt Schindler ở trên (vs config); Tuy nhiên, tôi nhận thấy rằng không HttpExceptions đã nhận được ném hai lần trong xử lý sự kiện ErrorLog_Filtering. Để tránh điều này, hãy đảm bảo bạn thực hiện kiểm tra kiểu trên phương thức GetBaseException. Đây là đoạn mã

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    if (e.Exception.GetBaseException() is HttpException) 
    { 
     if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404 
      && ((HttpContext)e.Context).Request.Path == "/favicon.ico") 
     { 
      e.Dismiss(); 
     } 
    } 
} 

Không có gì mới ở đây, chỉ là một FYI nếu bạn tình cờ thấy một số hành vi lạ.

Thanks ...

4

Nó không phải là ứng dụng web của tôi đang yêu cầu một favicon, đó là khi tôi duyệt đến trang elmah.axd, trình duyệt yêu cầu một favicon.

Giả sử, điều này sẽ làm việc:

<elmah> 
    <errorFilter> 
    <test> 
     <and> 
      <equal binding="HttpStatusCode" 
       value="404" type="Int32" /> 
      <regex binding="Context.Request.ServerVariables['URL']" 
       pattern="/favicon\.ico(\z|\?)" /> 
     </and> 
    </test> 
</errorFilter> 
</elmah> 

Nhưng đoán những gì, nó không.

Cách duy nhất tôi tìm được để làm việc là thêm một favicon.ico vào gốc web của tôi. Đây không phải cho trang web của tôi, nó chỉ dành cho trang elmah.axd. KHÔNG cần gọi route.IgnoreRoute.

Dưới đây là elmah.axd với favicon của tôi, và không có lỗi:

elmah with favicon.ico

+2

Hey Matt, bạn cần phải chắc chắn rằng bạn đăng ký ErrorFilter của bạn trong cả httpModule và system.webServer modules - và chúng cần phải được đăng ký sau khi các trình xử lý ErrorLog (hoặc bất kỳ mô đun ghi nhật ký nào khác) - đó là một ngăn xếp ngược lại, được ưu tiên khôn ngoan. –

+0

@Matt Enright Bình luận hay. – Kuncevic

5

tôi đã có thể để có được ELMAH để bỏ qua các lỗi bằng cách sử dụng mã dưới đây. Bạn có khả năng có thể thêm bất kỳ đường dẫn nào khác mà bạn muốn bỏ qua. Về mặt kỹ thuật, đây có thể là các thử nghiệm riêng biệt nhưng nếu tôi không muốn bỏ qua các lỗi 404 khác trong tương lai có liên quan đến ứng dụng của mình, tôi cho rằng tôi sẽ để các nhóm này lại với nhau vì chúng không phụ thuộc vào ứng dụng của tôi và chỉ ở đây để xóa lộn xộn khỏi quá trình ghi lỗi của tôi.

<errorFilter> 
    <test> 
     <or> 
      <and> 
       <equal binding="HttpStatusCode" value="404" type="Int32" /> 
       <equal binding="Context.Request.Path" value="/favicon.ico" type="string" /> 
      </and> 
      <and> 
       <equal binding="HttpStatusCode" value="404" type="Int32" /> 
       <equal binding="Context.Request.Path" value="/robots.txt" type="string" /> 
      </and> 
     </or> 
    </test> 
</errorFilter> 

Tất nhiên nếu bạn lo lắng về việc làm lộn xộn web.config của bạn, bạn luôn có thể chia bộ lọc thành tệp chuyên dụng.

<elmah> 
    <security allowRemoteAccess="1" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" /> 
    <errorFilter configSource="elmahFilters.config" /> 
</elmah>