web-dev-qa-db-ja.com

カスタムASP.NET MVC 404エラーページのルーティング

一般的な「リソースが見つかりません」ASP.NETエラーを表示する代わりに、誰かがASP.NET MVCで有効なアクションまたはコントローラーを呼び出さないURLを入力すると、カスタムHTTP 404エラーページを作成しようとしています。

これを処理するためにweb.configを使用したくありません。

無効なURLをキャッチするためにできるルーティングマジックはありますか?

更新:指定された答えを試しましたが、,い「リソースが見つかりません」というメッセージが表示されます。

別の更新: OK、明らかに何かがRC1で変更されました。 HttpExceptionに404をトラップしようとしても、「リソースが見つかりません」ページが表示されるだけです。

私もMvcContribのリソースの機能を使用しましたが、同じ問題がありません。何か案は?

114
dswatik

ルートテーブルの最後にキャッチオールルートを追加し、必要なページを表示します。

参照: ASP.NET MVCの「404ページが見つかりません」クエリを処理するためにキャッチオールルートを作成するにはどうすればよいですか?

10
Alex Reitbort

実稼働サーバーでカスタムエラーを3時間有効にしようとしましたが、ルートなしでASP.NET MVCでこれを行う方法の最終的なソリューションを見つけたようです。

ASP.NET MVCアプリケーションでカスタムエラーを有効にするには、IIS 7以降が必要です。

  1. system.webセクションの下のWeb設定でカスタムページを設定します。

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>
    

    RemoteOnlyは、ローカルネットワークで実際のエラーが表示されることを意味します(開発中に非常に役立ちます)。エラーコードのエラーページを書き換えることもできます。

  2. マジックレスポンスパラメータとレスポンスステータスコードの設定(エラー処理モジュールまたはエラーハンドル属性)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. system.webServerセクションの下のWeb設定で別の魔法の設定を設定します。

    <httpErrors errorMode="Detailed" />
    

これは私が見つけた最後のことであり、この後、実稼働サーバーでカスタムエラーを確認できます。

103
Andrew Orsich

この記事のビューを返すErrorControllerを作成することで、エラー処理が機能するようになりました。また、global.asaxのルートに「Catch All」を追加する必要がありました。

Web.configにない場合、これらのエラーページにどのように到達するかわかりません。私のWeb.configは以下を指定する必要がありました。

customErrors mode="On" defaultRedirect="~/Error/Unknown"

そして、私も追加しました:

error statusCode="404" redirect="~/Error/NotFound"
41
Jack Smit

ソース

NotFoundMVC -コントローラー、アクション、またはルートがASP.NET MVC3アプリケーションで見つからない場合に、使いやすい404ページを提供します。デフォルトのASP.NETエラーページの代わりに、NotFoundというビューが表示されます。

次を使用して、nuget経由でこのプラグインを追加できます。Install-Package NotFoundMvc

NotFoundMvcは、Webアプリケーションの起動時に自動的にインストールされます。通常、ASP.NET MVCによって404 HttpExceptionがスローされるさまざまな方法をすべて処理します。これには、コントローラー、アクション、およびルートの欠落が含まれます。

ステップバイステップインストールガイド:

1-プロジェクトを右クリックし、「Nugetパッケージの管理...」を選択します.

2-NotFoundMvcを検索してインストールします。 enter image description here

3-インストールが完了すると、2つのファイルがプロジェクトに追加されます。以下のスクリーンショットに示すように。

enter image description here

4-Views/Sharedに新しく追加されたNotFound.cshtmlを開き、自由に変更します。ここでアプリケーションを実行し、誤ったURLを入力すると、ユーザーフレンドリーな404ページが表示されます。

enter image description here

これ以上、ユーザーはServer Error in '/' Application. The resource cannot be found.のようなエラーメッセージを受け取ります

お役に立てれば :)

P.S: Andrew Davey このような素晴らしいプラグインを作成してくれてありがとう。

27
Yasser

IISエラーページを置き換えるには、web.configでこれを試してください。これは私が推測する最良の解決策であり、正しいステータスコードも送信します。

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

Tipila-カスタムエラーページの使用ASP.NET MVC からの詳細

19
Amila

このソリューションでは、web.configファイルの変更やキャッチオールルートは必要ありません。

まず、このようなコントローラーを作成します。

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

次に、「Views/Error/Index.cshtml」の下にビューを作成します。

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

次に、以下をグローバルasaxファイルに次のように追加します。

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

これを行った後でもカスタムIISエラーページが表示される場合は、Web構成ファイルで次のセクションがコメントアウト(または空)されていることを確認してください。

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>
15
Sujeewa

MVC 4で作業している場合、 this ソリューションを見ることができます。

次のApplication_ErrorメソッドをGlobal.asaxに追加します。

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

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

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

コントローラー自体は本当にシンプルです。

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

GitHubのMvc4CustomErrorPage の完全なソースコードを確認してください。

5
Duc Hoang

エラーページを1か所で完全にカスタマイズできる、真の答えを次に示します。 web.configを変更したり、別のコードを作成する必要はありません。

MVC 5でも機能します。

このコードをコントローラーに追加します。

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages に基づく

0
Andrus

特定のケースについてお話しますが、

以下のようにHomeControllerで「PageNotFoundメソッド」を使用している場合

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

これは機能しません。ただし、以下のようなルートタグをクリアする必要があります。

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

そして、web.configのメソッド名としてそれを変更した場合動作しますただし、web.configで以下のようなコードを実行することを忘れないでください

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
0
Furkan öztürk

私は同じ問題を抱えていました、あなたがしなければならないことは、viewsフォルダのweb.configファイルにcustomErrors属性を追加する代わりに、プロジェクトルートフォルダのweb.configファイルに追加する必要があることです

0
SmokeIT