14

MVC アプリを[HandleError]適切に使用するように設定したと思います。これは私のコントローラーです:

[HandleError]
public class SupportController : BaseController {

    public ActionResult Toss() {
        throw new Exception("uh oh");
    }
    // snip
}

そして、タグを「オン」設定しました。customErrorsweb.config

<customErrors mode="On"></customErrors>

ただし、例外でイエロー スクリーン オブ デスが表示されます。Toss()アクションにブレークポイントを設定すると、true に設定されていることHttpContext.IsCustomErrorEnabled 示されます。

私たちは View Engine で何もしてBaseControllerいませんし、何もいじっていません (また、View Engine を拡張しない他のコントローラーにも同じ問題があります)。

私は Windows XP で開発を行っていますが、アプリがサーバー 2003 ボックス (IIS 6) に展開されたときに同じ問題が発生します。

ページに例外があるとは思わないerror.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
</asp:Content>

異なる可能性があることの 1 つは、このアプリが MVC Beta が最新バージョンであったときに作成され、リリース時に RC にアップグレードされ、次に RTM にアップグレードされたことです。そこから残っているいくつかの奇妙な設定があったのでしょうか?

私はこれを他のアプリで動作させることができるので、少し当惑しています.

4

7 に答える 7

20

これは、エラー ページの処理に問題がある場合に発生する傾向があります。アプリをデバッグすると、最初の例外の直後に別の問題が発生します (エラー ページからの例外)。厳密に型指定されたマスター ページがあり、エラー ページがこのマスター ページを使用していたため、マスター ページが実際のページと同じモデルを共有していたため、マスター ページは型指定されたモデルではなく HandlerErrorInfo モデルを取得していたためです。

個人的には、これは asp.net mvc の設計が悪いと思いますが (残りの部分も同様です)、同じマスター ページを使用しないことで、これを簡単に回避できます (継承されたマスター ページの継承を行うこともできます)。型指定されていないレイヤーからレイヤーを純粋に継承する、厳密に型指定されたマスター ページ。

それ以外の場合、これはエラー ビューで何らかの例外が発生しています.. (ほとんどの場合)。

于 2009-06-17T14:22:39.163 に答える
3

IE9 を使用している場合、別の問題があります。次のように、1Kb 未満の場合、IE9 はエラー ページを非表示にしているようです。

asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page

コンテンツの本文の長さが 1Kb を超えていることを確認してください。エラーページの最後にこれを追加してみてください:

@(新しい文字列(' ', 1000))

于 2012-03-02T21:48:52.720 に答える
2

この問題のもう1つの理由は、

テンプレートMVCアプリケーション(VS2008 / VS2008 Expressで生成)では、Error.aspx(VSで生成)はマスターページを使用します。

マスターページが任意のViewDataにアクセスすると、null参照例外がスローされ、error.aspxは表示されません。

この単純なコードをError.aspxとして使用すると、問題が解決されます(CustomErrors = Onとともに)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
于 2009-07-27T14:20:35.067 に答える
1

私も同じ問題を抱えており、調査したところweb.Debug.configweb.config.

次に、ファイルにCustomErrorsタグを作成しましたが、うまくいきました。web.config

于 2010-07-09T16:31:54.457 に答える
1

私は同様の問題に遭遇し続けました。この「ハック」で望ましい結果を得ることができました。

すべてのコントローラーが BaseController を拡張するため、これはどこでも機能します。

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {

        Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>");

        base.OnException(filterContext);

    }

}
于 2012-01-20T02:41:52.640 に答える
0

よく考えてみた結果、私の問題は「エラー ビューのレンダリング時に別のエラーをスローするためだけにコードから例外をスローする」という一般的なカテゴリに分類されることがわかりました。以前、System.Exception を予期して厳密に型指定されたエラー ページを作成していましたが、[HandleError] 属性の使用に切り替えたときに、フィルターはエラー ページに System.HandleErrorInfo を渡していました。2 番目の例外は、次の行 (Default.aspx.cs 内) で発生しました。

httpHandler.ProcessRequest(HttpContext.Current);

紛らわしい。

于 2009-11-18T20:31:44.870 に答える