Лучший способ реализовать 404 в ASP.NET
Я пытаюсь определить лучший способ реализовать страницу 404 в стандартном веб-приложении ASP.NET. В настоящее время я обнаруживаю 404 ошибки в событии Application_Error в файле Global.asax и перенаправляется на дружественную страницу 404.aspx. Проблема заключается в том, что запрос видит перенаправление 302, за которым следует 404 страницы. Есть ли способ обойти перенаправление и ответить немедленным 404, содержащим дружественное сообщение об ошибке?
Помогает ли веб-искатель, например, робот Googlebot, если запрос на несуществующую страницу возвращает 302, за которым следует 404?
Ответы
Ответ 1
Обработайте это в своем событии Global.asax OnError:
protected void Application_Error(object sender, EventArgs e){
// An error has occured on a .Net page.
var serverError = Server.GetLastError() as HttpException;
if (null != serverError){
int errorCode = serverError.GetHttpCode();
if (404 == errorCode){
Server.ClearError();
Server.Transfer("/Errors/404.aspx");
}
}
}
На странице с ошибкой вы должны убедиться, что вы правильно настроили код состояния:
// If you're running under IIS 7 in Integrated mode set use this line to override
// IIS errors:
Response.TrySkipIisCustomErrors = true;
// Set status code and message; you could also use the HttpStatusCode enum:
// System.Net.HttpStatusCode.NotFound
Response.StatusCode = 404;
Response.StatusDescription = "Page not found";
Вы также можете обрабатывать различные другие коды ошибок здесь.
Google, как правило, будет следовать за 302, а затем соблюдать код статуса 404, поэтому вам нужно убедиться, что вы вернете это на странице с ошибкой.
Ответ 2
Вы можете использовать web.config для отправки 404 ошибок на пользовательскую страницу.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
Ответ 3
Самый простой ответ: не делайте этого в коде, но настройте IIS вместо.
Ответ 4
Вы используете это где угодно?
Response.Status="404 Page Not Found"
Ответ 5
Я вижу, что настройка страницы 404 в web.config - хороший метод очистки, НО она по-прежнему первоначально отвечает перенаправлением 302 на страницу с ошибкой. Например, если вы переходите к:
https://stackoverflow.com/x.aspx
вы перенаправляетесь через перенаправление 302 на:
https://stackoverflow.com/404?aspxerrorpath=/x.aspx
Я хочу, чтобы это произошло:
http://www.cnn.com/x.aspx
Нет перенаправления. Запрос отсутствующего URL-адреса возвращает код состояния 404 с дружественным сообщением об ошибке.
Ответ 6
Я также столкнулся с 302 вместо 404. Мне удалось исправить это, выполнив следующее:
Контроллер:
public ViewResult Display404NotFoundPage()
{
Response.StatusCode = 404; // this line fixed it.
return View();
}
Вид:
Показать сообщение об ошибке пользователю.
web.config:
<customErrors mode="On" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/404NotFound/" />
</customErrors>
Наконец, RouthConfig:
routes.MapRoute(
name: "ErrorPage",
url: "404NotFound/",
defaults: new { controller = "Pages", action = "Display404NotFoundPage" }
);
Ответ 7
Мне очень нравится этот подход: он создает единый вид для обработки всех типов ошибок и переопределяет IIS.
[1]: удалить все "customErrors" и "httpErrors" из Web.config
[2]: Проверить 'App_Start/FilterConfig.cs' выглядит так:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
[3]: в 'Global.asax' добавьте этот метод:
public void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
var routeData = new RouteData();
routeData.Values.Add("controller", "ErrorPage");
routeData.Values.Add("action", "Error");
routeData.Values.Add("exception", exception);
if (exception.GetType() == typeof(HttpException))
{
routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
}
else
{
routeData.Values.Add("statusCode", 500);
}
Response.TrySkipIisCustomErrors = true;
IController controller = new ErrorPageController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Response.End();
}
[4]: Добавить 'Controllers/ErrorPageController.cs'
public class ErrorPageController : Controller
{
public ActionResult Error(int statusCode, Exception exception)
{
Response.StatusCode = statusCode;
ViewBag.StatusCode = statusCode + " Error";
return View();
}
}
[5]: в разделе "Просмотры/Общие/Ошибка .cshtml"
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}
<h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>
//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace
: D
Ответ 8
Вы можете настроить сам IIS для возврата определенных страниц в ответ на любой тип ошибки HTTP (включая 404).
Ответ 9
Я думаю, что лучший способ - использовать конструкцию пользовательских ошибок в вашем web.config, как показано ниже, это позволяет вам прокладывать страницы для обработки всех разных HTTP-кодов простым способом.
<customErrors mode="On" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>