ELMAH がローカル サーバーの favico に対して 404 not found をログに記録することにすぐに気付きました。フィルターを使用してこのエラーを抑制するにはどうすればよいですか? 私はまだそれを設定することにあまり慣れていません..
6 に答える
elmah の公式エラー フィルタリング ページでは、この 404 ファビコン エラーを抑制する方法について説明しています。
このように、web.config で宣言的にすべての404 エラーを除外できます。ただし、ファビコンの 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 を宣言的にフィルタリングするか、ジョエルが提案するようにファビコンを提供することを好みます。
ELMAH の設定方法を学ぶのには役立ちませんが、favicon のリクエストに対する 404 を防ぐ最も簡単な方法は、favicon を提供することです...
以下のコードを使用して、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>
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>
しかし、そうではありません。
私が見つけた唯一の方法は、Web ルートに favicon.ico を追加することです。これは私のサイト用ではなく、elmah.axd ページ用です。route.IgnoreRoute を呼び出す必要はありません。
ここに私のfaviconを含むelmah.axdがあり、エラーはありません:
Elmahを設定するのではなく、ルートを無視します。これは私のために働きます:
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
上記のKurt Schindlerのプログラムによるソリューション(vs config)を使用していました。ただし、ErrorLog_Filtering イベント ハンドラーで非 HttpExceptions が 2 回スローされていることに気付きました。これを回避するには、GetBaseException メソッドで必ず型チェックを行ってください。これがスニペットです
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();
}
}
}
ここでは新しいことは何もありません。奇妙な動作が見られた場合の参考までに。
ありがとう...