2009-04-17 5 views
8

ローカルサーバーでfavicoに404が見つかりませんでした。このエラーをフィルタで抑制するにはどうすればよいですか?私はまだそれを設定することにとても慣れていません。ブロック404 ELMAhでのFavIcoエラー

答えて

18

公式のelmah Error Filtering pageは、この404 faviconエラーを抑制する方法をいくつか説明しています。

すべて web.configのように404エラーを宣言的にフィルタすることができます。私は確かにfaviconのためだけに404を押し開く方法があるとは確信していない。

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

あなたがプログラム的にそれをやってみたかった場合は公式ドキュメントで説明したように、あなたはのErrorLogやErrorEmailフィルタリングイベントでエラーを消すことができます。以下のコードはちょっと残念ですが、だけを除外して/favicon.icoリクエストのエラー 404エラーを示します。

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

私は、web.configを通じて宣言的にすべての404をフィルタリングするか、Joelが提案するようなfaviconを提供することを個人的に好みます。

+0

これは機能しますが、*すべての* 404エラーをフィルタリングすることはお勧めしません。それはELMAHの力を排除するようなものです。私はあなたが実際問題を修正*しているJoelのアプローチにもっと有利です。 – senfo

+2

loL!私はちょうど行った..ああ、私はちょうど実際にfaviconを追加することができます! – gideon

13

ELMAHの設定方法を学ぶのに役立つわけではありませんが、faviconの要求に対して404を防ぐ最も簡単な方法は、1つを提供することです。

2

私はElmahを設定するのではなく、ルートを無視します。これは私の作品:

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

ELMAHでこれを実際に確認してもよろしいですか?経路を無視することはできません。要求がMVCによって無視され、404aの通常のASP.NETパイプラインに渡され、ELMAHにログインする必要があります。 –

+0

私はそのコードを見てからしばらくしていましたので、私は二重チェックする必要がありましたが、私はライブサイトでこのテクニックを使っていました。それはIIS6とIIS7の違いですか? – Junto

+0

必要かどうかはサーバーの設定によって異なります。 Cassini(Visual Studioのデバッグ)では、これらの404がElmahによって記録されます。 IIS 6では、ルーティングによって無視される場合、Elmahはそれらを表示しません。私はIIS 7をテストしていません。 –

1

私は(設定VS)上記クルト・シンドラーのプログラム的なソリューションを使用していました。しかし、私は、非HttpExceptionsがErrorLog_Filteringイベントハンドラで2回スローされていることに気付きました。これを回避するには、GetBaseExceptionメソッドの型チェックを必ず行ってください。ここにスニペットがあります

ここでは何も新しいことはありません。ちょっとした奇妙な動作が起こった場合はこちらをご覧ください。

おかげで...

4

は、それは私のWebアプリケーションは、ファビコンを要求していることはありませんが、それは私がelmah.axdページを参照するとき、ブラウザがファビコンを要求していることです。

たぶん、これは動作するはずです:

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

しかし、それはない何をするか、と思います。

唯一の方法は、私のウェブルートにfavicon.icoを追加することです。これは私のサイトのものではなく、elmah.axdページのみです。 route.IgnoreRouteを呼び出す必要はありません。

は、ここに私のファビコンをelmah.axdなく、何のエラーです:

elmah with favicon.ico

+2

Hey Matt、あなたはあなたのErrorFilterをhttpModuleとsystem.webServerモジュール - ErrorLogハンドラ(または他のロギングモジュール)の後に登録する必要があります。これは優先順位が逆のスタックです。 –

+0

@Matt Enright良いコメント。 – Kuncevic

5

私はELMAHは、以下のコードを使用してエラーを無視してもらうことができました。無視したい他のパスも追加する可能性があります。技術的にはこれらは別々のテストになる可能性がありますが、オフチャンスで私は将来私のアプリケーションに関連する404エラーを無視したいと思っています。これらは私のアプリケーションに依存せず、私のエラーログから混乱を取り除くために。

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

もちろん、web.configが乱雑になることが心配な場合は、フィルタを専用ファイルに分割することができます。

<elmah> 
    <security allowRemoteAccess="1" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" /> 
    <errorFilter configSource="elmahFilters.config" /> 
</elmah> 
関連する問題