5

Web.configでオンになっているMVC3アプリにカスタムエラーを実装しています。

<customErrors mode="On">
  <error statusCode="403" redirect="/Errors/Http403" />
  <error statusCode="500" redirect="/Errors/Http500" />
</customErrors>

私のコントローラーは非常にシンプルで、対応する正しい名前のビューがあります。

public class ErrorsController : Controller
{
    public ActionResult Http403()
    {
        return View("Http403");
    }

    public ActionResult Http500()
    {
        return View("Http500");
    }
}

テストするために、別のコントローラーで例外をスローしています。

public class ThrowingController : Controller
{
    public ActionResult NotAuthorised()
    {
        throw new HttpException(403, "");
    }

    public ActionResult ServerError()
    {
        throw new HttpException(500, "");
    }
}

403は機能します-カスタムの「/Errors/Http403」にリダイレクトされます。

500は機能しません-代わりに、共有フォルダのデフォルトのエラーページにリダイレクトされます。

何か案は?

4

2 に答える 2

4

標準のcustomErros構成に加えてhttpErrorsを使用すると、500個のエラーが発生します。

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

そして、global.asaxからこの行を削除します

GlobalFilters.Filters.Add(new HandleErrorAttribute());

ただし、常にnullである最後のエラーを取得しようとしているため、完全ではありません。

Server.GetLastError()

私が見つけたMVC3のカスタムエラーに関する最も包括的な記事については、https: //stackoverflow.com/a/7499406/1048369を参照してください。これは非常に役立ちました。

于 2012-04-22T13:13:48.417 に答える
0

同じ問題が発生しました。その場合、Global.asaxで直接例外をキャッチします。

protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();

            Response.Clear();



            HttpException httpException = exception as HttpException;

            var code = httpException == null ? 500 : httpException.GetHttpCode();

            // Log the exception.
            if (code == 500)
                logError.Error(exception);

            Server.ClearError();

            Context.Items["error"] = code;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("action", "Index");
            routeData.Values.Add("code", code);

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

        }

これは私のカスタムエラー500にリダイレクトされます:/ Error / Index?code = 500

于 2012-04-20T15:09:04.813 に答える