I det här inlägget beskrivs hur man svarar med användarvänliga meddelanden när http-fel inträffar på din hemsida i ASP.NET Core. Anpassade http-felmeddelanden avslöjar inte någon information om din kod eller din konfiguration och anpassade felmeddelanden ser trevligare ut.
Http-fel kan vara klientfel med statuskoder från 400 till och med 499 eller serverfel med statuskoder mellan 500 och 599. Det vanligaste klientfelet är 404 ”Not Found” och det här felet uppstår när en användare försöker nå en sida som inte existerar.
Det är viktigt att svara med rätt statuskod även om din webbplats visar ett anpassat felmeddelande. En statuskod på 404 berättar för sökmotorer att sidan inte existerar och att de inte ska indexera den här sidan. Om din anpassade felsida svarar med en statuskod på 200 för en sida som inte existerar så riskerar du att få många dubbletter indexerade av sökmotorer.
Du kan inspektera svar och statuskoder under fliken Nätverk när du använder verktyg för programmerare i Google Chrome. Verktyg för utvecklare i Google Chrome är mycket användbara när du vill felsöka http-statuskoder.
Tjänster
Vi måste först registrera vår felhantering i metoden Configure i klassen StartUp. Vi kommer att svara med en anpassad felsida i miljöer som inte är utveckling, felinformationen under utveckling kommer att vara betydligt mer detaljerad. Parametern {0} som ligger i den relativa url:en (/home/error/{0}) innehåller statuskoden.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Use error handling
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseStatusCodePagesWithReExecute("/home/error/{0}");
}
// More code ...
} // End of the Configure method
Controller
Vi måste lägga till en error-metod i vår home-controller för att hantera förfrågningar när http-fel uppstår på vår hemsida. Vi har skapat 3 olika statiska sidor för att hantera anpassade felmeddelanden, statiska sidor hanteras av en klass som implementerar IStaticPageRepository. Standardfelsidan visar statuskoden 500 ”Internt serverfel”.
public class homeController : Controller
{
#region Variables
private readonly IStaticPageRepository static_page_repository;
private readonly IGroupRepository group_repository;
private readonly IFinalRepository final_repository;
#endregion
#region Constructors
public homeController(IStaticPageRepository static_page_repository, IGroupRepository group_repository, IFinalRepository final_repository)
{
// Set values for instance variables
this.static_page_repository = static_page_repository;
this.group_repository = group_repository;
this.final_repository = final_repository;
} // End of the constructor
#endregion
#region View methods
// Get the error page
// GET: /home/error/404
[HttpGet]
public IActionResult error(string id = "")
{
// Set the connection id
byte connectionId = 2;
if (id == "404")
{
connectionId = 3;
}
else if(id == "401")
{
connectionId = 4;
}
else
{
connectionId = 2;
}
// Get the error page
StaticPage staticPage = this.static_page_repository.GetOneByConnectionId(connectionId);
staticPage = staticPage != null ? staticPage : new StaticPage();
// Create the bread crumb list
List<BreadCrumb> breadCrumbs = new List<BreadCrumb>(2);
breadCrumbs.Add(new BreadCrumb("Startsidan", "/"));
breadCrumbs.Add(new BreadCrumb(staticPage.link_name, "/home/error/" + id.ToString()));
// Set form values
ViewBag.BreadCrumbs = breadCrumbs;
ViewBag.StaticPage = staticPage;
// Return the view
return View();
} // End of the error method
#endregion
} // End of the class
Vy
Vår felmetod i vår hemkontroller returnerar en vy som heter error.cshtml som svar på http-fel. Vår felvy använder en layoutvy och visar en titel och en beskrivning.
@using Annytab.Models
@{
// Get form values
StaticPage staticPage = ViewBag.StaticPage;
// Set meta data
ViewBag.Title = staticPage.title;
ViewBag.MetaTitle = staticPage.title;
ViewBag.MetaDescription = staticPage.meta_description;
ViewBag.MetaKeywords = staticPage.meta_keywords;
ViewBag.MetaCanonical = "http://www.mysite.nu/home/error";
ViewBag.MetaRobots = staticPage.meta_robots;
// Set the layout for the page
Layout = "/Views/shared_front/_standard_layout.cshtml";
}
@*Title*@
<h1>@ViewBag.Title</h1>
@*Description*@
<div class="annytab-basic-bread-text">@Html.Raw(staticPage.main_content)</div>
<div class="annytab-basic-space"></div>
@section scripts {
<script>$("#txtSearch").focus();</script>
}