假如用戶在Web瀏覽器上敲錯了URL,訪問了ASP.NET Core站點下一個不存在的URL地址,那么默認情況下ASP.NET Core會返回給瀏覽器著名的404錯誤,那么有什么辦法可以讓ASP.NET Core返回404的Http狀態碼時,自動跳轉到主頁嗎?
使用ASP.NET Core的中間件(Middleware)即可。
首先我們定義一個叫Jump404Middleware的中間件類,用於處理一旦ASP.NET Core的Pipeline返回404響應狀態碼,就跳轉到網站主頁:
public class Jump404Middleware { private readonly RequestDelegate next; public Jump404Middleware(RequestDelegate next) { this.next = next; } public async Task Invoke( Microsoft.AspNetCore.Http.HttpContext context) { await next.Invoke(context); var response = context.Response; //如果是404就跳轉到主頁 if (response.StatusCode == 404) { response.Redirect("/"); } } }
注意檢測Response狀態碼(是否為404)和Redirect跳轉的邏輯都是寫在await next.Invoke(context)之后的。
然后定義一個Jump404Middleware中間件的擴展類Jump404MiddlewareExtension:
public static class Jump404MiddlewareExtension { public static void UseJump404(this IApplicationBuilder app) { app.UseMiddleware<Jump404Middleware>(); } }
最后在ASP.NET Core中Startup類的Configure方法中使用Jump404Middleware中間件即可:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseJump404(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
這樣當用戶在Web瀏覽器上敲錯了URL,訪問了ASP.NET Core站點下一個不存在的URL地址時,ASP.NET Core就不會返回404錯誤了,而是將用戶瀏覽器的URL地址跳轉到網站主頁上,避免了報錯,其實現在很多大型網站(京東、淘寶等)都實現了這個功能。
