7

グローバルASAXOnErrorハンドラーに送信されたエラーが発生したことを理解しようとしています。

using System;
using System.Web;

namespace GLSS.Components.HttpModules
{
  public class ExceptionModule : System.Web.IHttpModule 
  {
    private void OnError(object sender, EventArgs e)
    {
      HttpContext context = HttpContext.Current;

      //get the last error
      Exception ex = context.Server.GetLastError();
      if(ex.InnerException.GetType().ToString() == "CSLA.DataPortalException")
        ex = ex.InnerException;

これが私の例外を文字列に変換したものです

HttpContext.Current.Server.GetLastError().Message
"File does not exist."
HttpContext.Current.Server.GetLastError().StackTrace
"   at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response)
at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context)
at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)"

このエラーの原因となっているコード行を特定するにはどうすればよいですか?エラーが発生したときにデバッグオプションを中断するように設定しようとしましたが、失敗しました。それでも、ONERRORグローバルハンドラーが表示されます。

1つは、コードが内部例外があると想定していることです。これはNULLのように見え、ハンドラー内で2番目のエラーを引き起こしています。

コンパイルされたコードのどこかでエラーが発生していると思います。Web.Configを確認しましたが、そこに記載されているパスはログパスのみであり、それは有効であり、ログは機能しているようです。

更新 私はここでいくつかの追加情報を見つけました:

例外「ファイルが存在しません」を解決するにはどうすればよいですか?

イミディエイトウィンドウでこれを確認すると、次のようになります。

? HttpContext.Current.Request.Url.ToString()
"http://localhost:2322/favicon.ico"

しかし、私が困惑しているのは、「ファイル内検索」を使用してfavicon.icoを探してソリューション全体を検索し、参照が表示されないことです。

アイコンファイルへの参照が表示されないのに、アイコンファイルが見つからないというエラーが表示されるのはなぜですか?いくつかのアセンブリがそれを使用していると思いますか?しかし、なぜそれがWebルートでそれを探しているのでしょうか。

4

1 に答える 1

15

favicon.icoのリクエストは、ほとんどの最新のブラウザによって盲目的に行われており、ファビコンがない場合は404(ファイルが見つかりません)を期待しています(これは適切な動作です)。以下に、リンクタイプ「アイコン」に関するHTML5ワーキングドラフトからの引用を示します 。

iconキーワードのリンクがない場合、HTTPまたはHTTPSを介して取得されたドキュメントの場合、ユーザーエージェントは代わりに、ドキュメントのアドレスに対してURL/favicon.icoを解決することによって取得された絶対URLのアイコンを取得して使用しようとします。ページは、iconキーワードを使用してそのアイコンを宣言していました。

例外が表示される理由は、マネージド/統合パイプラインモードを使用するように構成されたWeb開発サーバーまたはIISが、すべての要求(エラーを含む)をGlobal.asaxに送信するためです。

ファビコンへの次のダミーリンクを作成することで、ブラウザがリクエストを行わないようにすることができます。

<html>
    <head>
        <link rel="shortcut icon" href="#" />
        ...
    </head>
...
</html>

次のいずれかを試すこともできます。

  • RegisterRoutesメソッドの先頭に次の行を追加します。

    routes.IgnoreRoute("favicon.ico");

    またはさらに拡張されたバージョン:

    routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});

  • ファビコン用の空のファイルを自分で作成します
  • 404/favicon.icoをチェックして、エラーHttpException.GetHttpCode()を除外します。((System.Web.HttpApplication)Sender).Context.Request.Url
于 2013-02-04T15:38:49.317 に答える