5

ASP.NETMVC4でエラーを正しく処理する方法を理解するのに苦労しています。例として、「インターネットアプリケーション」テンプレートを使用して新しいMVC4プロジェクトを作成し、ホームコントローラーを更新していくつかのエラーケースをテストしました。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Hello";
        return View();
    }

    public ActionResult About()
    {
        throw new HttpException(401, "Not Authorized");
    }

    public ActionResult Contact()
    {
        throw new Exception("Oh no, some error occurred...");
    }
}

web.configファイルでcustomErrorsを有効にしました。

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

アプリを実行して[連絡先]をクリックすると、グローバルフィルターとして登録されているため、期待どおりに〜/ Views / Shared/Error.cshtmlビューが表示されます。HandleErrorAttribute

ただし、[バージョン情報]をクリックすると、「ランタイムエラー」という標準のASP.NET黄色のエラーページが表示されます。これらの2つの例外の処理が異なるのはなぜですか。また、属性を使用してインスタンスを取得するにはどうすればよいですか。HttpExceptionHandleError


CustomErrors構成

理想的には、次のカスタムエラーページが必要です。

  • 素敵でユーザーフレンドリーなカスタム404(見つかりません)ページ
  • アクセス権がないことをユーザーに通知するカスタム401(許可されていない)ページ(たとえば、モデル内の特定のアイテムのアクセス許可を確認した後にスローされます)
  • 他のすべての場合に使用される一般的なエラーページ(標準の黄色のASP.NETページの代わりに)。

上記の各シナリオのビューを備えた新しい「エラー」コントローラーを作成しました。次に、web.configのcustomErrorsを次のように更新しました。

<customErrors mode="On" defaultRedirect="~/Error/Trouble">
    <error statusCode="404" redirect="~/Error/NotFound"></error>
    <error statusCode="401" redirect="~/Error/NotAuthorized"></error>
</customErrors>

404ページは正常に機能しますが、401ページがまったく表示されません。代わりに、コントローラーのアクションにアクセスしようとすると、 〜/ Error / Troubleビュー(として指定されたもの)が表示されます。defaultRedirectAboutHome

カスタム401リダイレクトページが機能しないのはなぜですか?

4

3 に答える 3

16

ASP.NETは、401を内部的に使用して、ユーザーをログインページにリダイレクトします。許可されていない401をスローすることを計画していた場所では、代わりに禁止された403をスローします。

于 2012-11-28T14:52:49.620 に答える
8

403ではなく401を返す必要がある場合は、次を使用できます。

HttpContext.Current.Response.SuppressFormsAuthenticationRedirect = true
于 2013-02-22T05:42:48.077 に答える
5

web.configを変更しても、ページに移動するために401エラーが発生しないという同様の問題が発生しました。

401の場合、web.configのcustomerrorsセクションに401を追加した場合でも、おそらく標準の401Unauthorizedページが表示されます。IISとWindows認証を使用する場合、ASP.NETが要求を認識する前にチェックが行われるため、独自の401が表示されることを読みました。

私のプロジェクトでは、Global.asaxファイルを編集して、401エラー用に作成したルートにリダイレクトし、ユーザーを「これを表示する権限がありません」ビューに移動しました。

Global.asaxの場合:

    void Application_EndRequest(object sender, System.EventArgs e)
    {
        // If the user is not authorised to see this page or access this function, send them to the error page.
        if (Response.StatusCode == 401)
        {
            Response.ClearContent();
            Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults);
        }
    }

およびRoute.config内:

        routes.MapRoute(
        "ErrorHandler",
        "Error/{action}/{errMsg}",
        new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional }
        );

およびコントローラー内:

    public ViewResult Unauthorised()
    {
        //Response.StatusCode = 401; // Do not set this or else you get a redirect loop
        return View();
    }
于 2014-02-10T16:50:59.017 に答える