0

私は webforms プロジェクトを持っていて、すべての 404 エラーを Global.asax に記録したかったので、次のコードをそこに置きました。

void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    if (httpException == null)
    {
        Log.Error(string.Format("Unkown error:", Request.Url.AbsoluteUri), exception);
    }
    else if (httpException.GetHttpCode() == 404)
    {
        Log.Warn(string.Format("RequestError 404: {0}", HttpContext.Current.Request.Url.AbsoluteUri));
    }
    else
    {
        Log.Error(string.Format("RequestError {0}: {2}\r\n{1}", httpException.GetHttpCode(), Server.UrlDecode(Request.Headers.ToString()), HttpContext.Current.Request.Url.AbsoluteUri), httpException);
    }
}

これは、拡張子 '.aspx' を持つすべての要求で正常に機能します。それがないと、または別の拡張機能を使用するApplication_Errorと、バイパスされます。

これは私のweb.config

<customErrors defaultRedirect="/500.aspx" mode="Off">
  <error statusCode="404" redirect="/404.aspx"/>
  <error statusCode="500" redirect="/500.aspx"/>
</customErrors>

何か案が?

4

1 に答える 1

6

Global.asax ファイルで定義されているエラー ハンドラーは、ASP.NET ランタイムによる要求の処理中に発生したエラーのみをキャッチします。たとえば、アプリケーションで発生しない .aspx ファイルをユーザーが要求すると、エラーがキャッチされます。ただし、ユーザーが存在しない .htm ファイルを要求した場合、エラーはキャッチされません。ASP.NET 以外のエラーの場合は、インターネット インフォメーション サービス (IIS) でカスタム ハンドラーを作成できます。カスタム ハンドラーは、サーバー レベルのエラーに対しても呼び出されません。

これはhttp://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspxからの抜粋です

于 2013-01-16T16:28:21.693 に答える