11

ASP.NET MVC 4 アプリケーションでエラーが発生した場合、エラーの種類に応じてユーザーのビューをカスタマイズしたいと考えています。たとえば、ページが見つからない、または例外が発生した (例外に関するユーザーフレンドリーな詳細を含む)。StackOverflow やその他のオンライン ソースでこれを行う方法の他の例を確認しましたが、どの回答もうまくいきません。

基本的な [HandleError] 属性は、VS2012 で .NET 4.5 をターゲットとする MVC 4 アプリケーションで機能していないようです。ホームコントローラーにあるコードは次のとおりです。

[HandleError]
public ActionResult Index()
{
    Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
    throw new NullReferenceException("Uh oh, something broke.");
}

例外をスローしているだけで、[HandleError] 属性のためにデフォルトの ~/Shared/Error.cshtml ビューが返されることを期待していますが、ページを表示できないことを示す HTTP 500 Internal Server Error だけが表示されます。表示されます。web.config を確認したところ、さまざまな構成が奇妙な動作をしているようです。このセクションには、現在次のものが含まれています。

<customErrors mode="On" />

(defaultRedirect と customErrors mode="Off" を追加しようとしましたが、効果はありませんでした...共有のエラー ビューも CustomError ビューもレンダリングされていません。customErrors モードをオフに変更すると、すると、期待通りに例外の詳細を見ることができるので、「あ、何か壊れた」という例外をちゃんとスローしています。

また、OnException ハンドラーを HomeController に追加しようとしましたが、デバッグして OnException イベントが発生していることを確認できますが、違いはありません。

protected override void OnException(ExceptionContext filterContext)
{
    base.OnException(filterContext);
    filterContext.ExceptionHandled = true;
    if (filterContext == null)
    {
        filterContext.Result = View("CustomError");
        return;
    }
    Exception e = filterContext.Exception;
    // TODO: Log the exception here
    ViewData["Exception"] = e; // pass the exception to the view
    filterContext.Result = View("CustomError");
}

ビューを指定するために [HandleError] を変更しようとしましたが、それも何もしていないようです:

[HandleError(View="CustomError")]

どんな助けでも大歓迎です。詳細が必要な場合はお知らせください。

4

4 に答える 4

5

また、カスタム エラー ページを機能させるために、SO の回答やさまざまなブログ投稿を読むという、終わりのない旅に出ました。以下は、最終的に私のために働いたものです。

最初のステップは、組み込みの Cassini Web サーバーの代わりに IIS Express をデバッグに使用して、デバッグ エクスペリエンスがライブ環境を反映することを「保証」することです。

アプリケーション エラーを処理するコントローラーを作成し、処理するカスタム エラーごとにアクションを追加します。アクションは、ログを記録し、ステータス コードを設定し、ビューを返す必要があります。

public class ErrorsController : Controller
{
    // 404
    [HttpGet]
    public ActionResult NotFound()
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View();
    }

    // I also have test actions so that I can verify it's working in production.
    [HttpGet]
    public ActionResult Throw404()
    {
        throw new HttpException((int)HttpStatusCode.NotFound, "demo");
    }
}

customErrorsカスタム エラー アクションにリダイレクトするように web.configのセクションを構成します。

  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="Errors/InternalServerError">
      <error statusCode="400" redirect="Errors/BadRequest" />
      <error statusCode="403" redirect="Errors/Forbidden" />
      <error statusCode="404" redirect="Errors/NotFound" />
      <error statusCode="500" redirect="Errors/InternalServerError" />
    </customErrors>

httpErrorsweb.config にセクションを追加しsystem.webServer、errorMode を Detailed に設定します。なぜこれが機能するのかは私には謎ですが、これが鍵でした.

  <system.webServer>
    <httpErrors errorMode="Detailed" />

定義されたルートの最後にキャッチオール ルートを追加して、404 をカスタム ページに誘導します。

            // catchall for 404s
        routes.MapRoute(
            "Error",
            "{*url}",
            new {controller = "Errors", action = "NotFound"});

カスタムを作成し、HandleErrorAttributeそれをグローバル フィルターとして登録して、500 エラーを記録することもできます。

これらの手順は、開発環境 (IIS Express) と運用環境 (IIS7) の両方でうまくいきました。customErrors mode="On"開発で効果を確認するには、変更する必要があります。

于 2012-12-12T18:45:05.037 に答える
4

localhost 以外の IP アドレス (通常は別のコンピューター) からページを呼び出さなければならなかったことを思い出すようです。また、組み込みの開発サーバーではなく、IIS ベースのサーバーである必要があります (つまり、IIS または IIS Express ですが、外部アクセス用に IIS Express を構成する必要があり、これは面倒です)。

実際にデバッグできます。デバッグ コンピューターでローカル サーバーを構成して外部要求を受け入れ、リモート サーバーからローカル サーバーを呼び出す必要があります。

于 2012-12-13T01:08:40.877 に答える
1

customErrorsタグに次の属性を追加してみてください。

defaultRedirect="Error"

これは、エラーがスローされ、デフォルトで属性にビューが指定されていない場合に、MVC がユーザーをリダイレクトするビューを明示的に定義します。これはもちろん、 views フォルダーError.cshtmlに存在する場合にのみ機能します。Shared

于 2012-12-12T18:35:44.253 に答える