ASP.NET Webアプリケーションで独自のエラーページを表示する方法はこちらの記事を参照してください。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ErrorPageCustom
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStatusCodePagesWithRedirects("~/Error?c={0}");
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
@page
@model ErrorPageCustom.Pages.ErrorModel
@{
}
<html>
<head>
</head>
<body>
<p>エラーページです。コード:@Model.code</p>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace ErrorPageCustom.Pages
{
public class ErrorModel : PageModel
{
public string code { get; set; }
public void OnGet(string c)
{
code = c;
}
}
}
@page
@{
}
<html>
<head>
</head>
<body>
<p>テストページです。</p>
</body>
</html>
@page
@model ErrorPageCustom.Pages.Proc1Model
@{
}
<html>
<head>
</head>
<body>
<p>例外が発生するページです。</p>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace ErrorPageCustom.Pages
{
public class Proc1Model : PageModel
{
public void OnGet()
{
int a = 12;
int b = 0;
int c = a / b;
}
}
}
@page
@model ErrorPageCustom.Pages.Proc2Model
@{
}
<html>
<head>
</head>
<body>
<p>500レスポンスを返すページです。</p>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace ErrorPageCustom.Pages
{
public class Proc2Model : PageModel
{
public IActionResult OnGet()
{
return StatusCode(500);
}
}
}
UseStatusCodePagesWithRedirects()
メソッドでエラーページへのリダイレクト処理を追加します。{0}
のプレースホルダーが利用できます。このプレースホルダーにステータスコードが設定されます。 app.UseStatusCodePagesWithRedirects("~/Error?c={0}");
RazorPage は今回のでもプログラムでは4つ用意します。c
パラメーターでエラーのコードを受け取り、ページにエラーコードを表示します。IActionResult
を返す動作にしてあります。戻り値で StatusCode(500)
を記述し、レスポンスコード 500 を返す動作としています。アプリケーションルートのURL/Penguin
にアクセスします。存在しないURLのため、404エラーが表示されます。ページの表示は下図となります。
Error.cshtml ファイルのコンテンツが表示されており、ステータスコードの404 もページ内に表示されていることが確認できます。アプリケーションルートのURL/Proc1
にアクセスします。下図の画面が表示されます。RazorPage内で例外が発生した場合は、ステータスコード500は帰りますが、
他のレスポンスは何も返らず、アプリケーションのリダイレクトも実行されないため、Webブラウザの500レスポンスのエラー画面が表示されます。アプリケーションルートのURL/Proc2
にアクセスします。Proc2では、OnGetメソッドの戻り値でStatusCode(500)
を返しています。この場合は、
アプリケーションのリダイレクト処理が実行され、Error.cshtml のページが表示されます。ステータスコードも 500 が表示されています。