5

これがエラー メッセージをカスタム ページに渡す正しい方法である場合、この解決策についてどう思われますか?

web.config:

    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>

Global.asax で:

<script RunAt="server">
    void Application_Error(object sender, EventArgs e)
    {
    Exception ex = Server.GetLastError();
    if (ex != null && Session != null)
    {
        ex.Data.Add("ErrorTime", DateTime.Now);
        ex.Data.Add("ErrorSession", Session.SessionID);
        HttpContext.Current.Cache["LastError"] = ex;
    }
    }

</script>

私のError.aspx.csで:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
            if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
                Label1.Text = ex.InnerException.Message;
    }
}

問題: Global.asax から Server.Transfer を実行したくない.. わからない。私には不器用に見えました。customErrors を RemoteOnly に変更できるようにしたい。したがって、最後の例外をどこかに保存する必要がありますが、セッションにすることはできません。キャッシュに保存しますが、キャッシュはグローバルであり、誰かに間違ったエラーを表示しないようにするため、追加のデータ (時間とセッション ID) を付けて保存します。


コードを少し変更しました。今では次のとおりです。

void Application_Error(object sender, EventArgs e)
{
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
    Server.ClearError();
}

...と...

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex != null)
            Label1.Text = ex.Message;
    }
}

匿名ユーザーの場合、SessionID が存在しないことに注意してください。ex.Data.Add キーが既に存在するとエラーが発生し、ClearError を呼び出すことが重要であることがわかります。

4

6 に答える 6

7

それはまともな方法だと思います。それは私が行う方法ではありませんが、私のコードは長すぎて投稿できません(そしてVB.NETで)。

私が変更することの1つは、エラーページ自体です。エラーを表示する代わりに、ユーザーが自分の電子メールアドレスを入力し、ボタンをクリックしてエラーレポートを送信できるオプションのフィールドとして、エラーページにテキストボックスを追加することを検討してください。次に、エラーレポートを受け取ったら、問題を確認して返信できます。これははるかにユーザーフレンドリーな方法であり、私がこれを行ったサイトでは非常にうまく機能しています。

これらの方針に沿って、フォームデータ、セッションデータ、およびその他の価値のあるものを収集し、それをエラーレポートに含めることもできます。これにより、問題の診断がはるかに簡単になります。

于 2009-07-14T22:20:11.047 に答える
1

キャッシュはグローバルであるため、誰かに間違ったエラーを表示している可能性があると述べたので、これはお勧めできません。また、セキュリティ上の理由から、エラー メッセージをエンド ユーザーに直接出力しないでください。

この問題を見てください:

ASP.NET カスタム エラー ページ サーバーの GetLastError が null です

要約すると、次のようになります。

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message)))

CustomErrors セクションの設定を使用してリダイレクトを行うために ASP.NET に依存するのではなく。

于 2009-07-14T19:30:28.750 に答える
1

私たちはあなたにとってうまくいくかもしれないし、うまくいかないかもしれない何かをします. DB で広範なロギングを行います。エラーが発生すると、それをログに記録し、エラー ID を生成します。エラー ID を含む汎用ページにリダイレクトし、そこで詳細を取得します。

もちろん、エラーが「DBに接続できません」の場合、これは表面的にはフラットになりますが、それはあまり頻繁には起こりません;)

于 2009-07-14T19:33:08.403 に答える
1

n8wrl と Steve の両方に、データベースにエラーを記録し、エラー ID だけをユーザーに返す方が良いという意見に同意する必要があります。彼らは実際には技術的な詳細を見る必要はなく、これにより機密情報が公開される可能性があります。

私たちの場合、ユーザーの ID (利用可能な場合) とエラーが発生したページも渡します (グローバルな Application_Error に到達するときは、Request.URL で問題ありません)。このようにして、エラーを少し簡単に追跡できます。また、スクリプト タグで Global.asax を使用する必要がないことにも注意してください。App_Code ディレクトリに Global.asax.cs ファイルを作成すると、C# を直接コーディングできます (ただし、これはプロジェクトの種類によって異なる場合があります)。

于 2009-07-14T23:59:11.440 に答える
0

カスタムエラーページの作成を担当しました。すべてが非常に単純でした: 私が持っていた web.config ファイルで:

<customErrors mode="On">
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1"
</customErrors>

Global.asax の Application_Error メソッド: いくつかのコード...

Server.Transfer("~/error-pages/error.aspx");

カスタム エラー ページ「error.aspx」:Server.ClearError();

何が変更されたのか正確にはわかりませんが、これは機能しなくなりました。コードが Server.Transfer メソッドに到達すると、常に例外が発生しました: ページの子リクエストの実行中にエラーが発生しました...

私はいくつかの解決策を見て、最終的にこれを見つけました。私は自分のコードを変更しましたが、今ではうまくいくようです:

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx">
  <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" />
</customErrors>

および global.asax メソッドで:

Session["LastError"] = Server.GetLastError();

Cache[""] コードでも機能しましたが、私は Session 変数の方が好みでした。

それでは、ご回答ありがとうございます。

  • カスタム エラー ページでエラーをクリアすることを忘れないでください。これは重要。また、すべてのエラーを正確にユーザーに表示しないように指示されます。たぶん、特定のユーザーフレンドリーな形式です。そして、すべての情報をログ ファイルに記録するか、電子メールなどで送信します。

これが役に立ったことを願っています。

于 2013-10-03T13:01:41.533 に答える
0
Server.ClearError();

この行は、ErrorMessage を表示した後に Error.aspx.cs に配置する必要があると思います。

于 2009-10-29T11:35:46.000 に答える