ASP.NET MVC 5 - дескриптор ошибки для - 404 страница не найдена - PullRequest
0 голосов
/ 14 сентября 2018

Для стандартных ошибок я использую дескриптор ошибки решения (см. Код ниже), а также я пробовал ЭТО (без эффекта)

Global.asax.cs

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

        var httpException = exception as HttpException;
        var routeData = new RouteData();

        routeData.Values.Add("controller", "Error");

        if (httpException == null)
            routeData.Values.Add("action", "Index");
        else //It's an Http Exception, Let's handle it.
            switch (httpException.GetHttpCode())
            {
                case 404:
                    // Page not found.
                    routeData.Values.Add("action", "HttpError404");
                    break;
                case 500:
                    // Server error.
                    routeData.Values.Add("action", "HttpError500");
                    break;

                // Here you can handle Views to other error codes.
                // I choose a General error template  
                default:
                    routeData.Values.Add("action", "General");
                    break;
            }

        // Pass exception details to the target error View.
        routeData.Values.Add("error", exception);

        var request = Request;
        // Pass request details to the target request View.
        routeData.Values.Add("request", request);

        // Clear the error on server.
        Server.ClearError();

        // Avoid IIS7 getting in the middle
        Response.TrySkipIisCustomErrors = true;

        // Call target Controller and pass the routeData.
        IController errorController = new ErrorController();
        errorController.Execute(new RequestContext(
            new HttpContextWrapper(Context), routeData));
}

ErrorController

public class ErrorController : Controller
{
    private readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    // GET: Error
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult HttpError404(string error, HttpRequest request)
    {
        ViewBag.Title = "Page not found (Error 404)";
        ViewBag.Description = error;
        return View("~/Views/Shared/Error.cshtml");
    }

    public ActionResult HttpError500(string error, HttpRequest request)
    {
        ViewBag.Title = "Internal server error (Error 500)";
        ViewBag.Description = error;
        return View("~/Views/Shared/Error.cshtml");
    }

    public ActionResult General(string error, HttpRequest request)
    {
        ViewBag.Title = "Internal server error";

        ViewBag.Description = error;
        return View("~/Views/Shared/Error.cshtml");
    }
}

Error.cshtml

@{
    Layout = "_Layout.cshtml";
}

<div class="row">
    <div class="exceptionmessage col-md-12 text-center">
        <div class="center-block">
            <img src="~/Content/i/404.png" class="img-responsive"/>
        </div>

        <strong>@ViewBag.Message</strong>
        <span class="center-block small text-uppercase">@ViewBag.Main</span>


        <div class="center-block">@Html.ActionLink("Return to the Homepage", "Index", "Home", null, new {@class = "btn btn-primary"})</div>
    </div>
</div>

У меня есть каталог Techs, гдеУ меня есть некоторые XML-файлы (для данных загрузки, что-то вроде локальной БД), и с помощью этого сценария в web.config я отключаю доступ к этой папке и загружаю файлы из этой папки (или когда я пишу несуществующий URL-адрес или файл * 1022)*), Я получил сообщение IIS 404 Страница не найдена без перенаправления на мою пользовательскую страницу ошибки 404 из приведенного ниже кода обработчика ошибок.

Error Page

  <system.web>    
    <customErrors mode="On" defaultRedirect="~/Error">
      <error redirect="~/Error/HttpError404" statusCode="404" />
    </customErrors>
  </system.web>

  <system.webServer>    
    <security xdt:Transform="Replace">
      <requestFiltering>
        <hiddenSegments>
          <add segment="Techs" />
        </hiddenSegments>
      </requestFiltering>
    </security>
  </system.webServer>

IsЕсть ли способ обработки всех ошибок с 404 страницы не найдены (с одной и той же страницы, а не две разные)?

Спасибо

РЕДАКТИРОВАТЬ:

Я добавляю новый маршрут для моего ErrorController в RouteConfig.cs:

routes.MapRoute("Error",
                "{controller}/{action}/",
                new { controller = "Error", action = "HttpError404" });

, после чего меняю web.config на:

<customErrors mode="On" defaultRedirect="~/Error/General">
    <error redirect="~/Error/HttpError404" statusCode="404" />
    <error redirect="~/Error/HttpError500" statusCode="500" />
</customErrors>

<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error
        statusCode="404"
        path="/Error/HttpError404"
        responseMode="ExecuteURL"/>
    </httpErrors>

Но он все равно не работает, ягot Ошибка HTTP 404.0 - Не найдено или Ошибка HTTP 403.14 - Запрещено и подобные сообщения, когда я пишу, например:

  • web.com / Techs /
  • web.com / Techs / catalog.csv
  • web.com / Techs.pdf -> перенаправить на страницу 404
  • web.com / Home / c.pdf

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете создать папку с именем, например Ошибка , в домашнем каталоге, а затем создать html-страницу ошибки с вашим собственным дизайном.

В веб-конфигурации добавьте следующее:

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/Error/404.html" />
</customErrors>

Это приведет к перенаправлению на 404.html в папке Error.

Если вы хотите проверить конкретные ошибки в контроллере и перенаправить на соответствующие страницы ошибоквы можете создать ErrorController в контроллере и представления для различных типов ошибок, которые вы хотите проверить в папке Error views.например:

    //In the ErrorController
    // GET: /Error/404 Bad request
    public ActionResult E404()
    {
        return View();
    }

и в контроллере, если страница не найдена или id == null, вы можете сделать что-то вроде:

if (id == null)
{
    return RedirectToAction("E404", "Error");
}
0 голосов
/ 17 сентября 2018

Мое решение, которое РАБОТАЕТ

Я не добавляю новый маршрут в RouteConfig.cs, только отредактируйте файл ниже. Контроллеры, которые я вызываю методом без параметра, ко мне относились по-разному. Global.asax.cs и ErrorController используют то же, что и выше.

Web.config

<system.web>   
    <customErrors mode="On" defaultRedirect="~/Error/General">
      <error redirect="~/Error/HttpError404" statusCode="403" />
      <error redirect="~/Error/HttpError404" statusCode="404" />
      <error redirect="~/Error/HttpError500" statusCode="500" />
    </customErrors>

  </system.web>

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" />
      <remove statusCode="404" />
      <remove statusCode="500" />
      <error
        statusCode="403"
        path="/Error/HttpError404"
        responseMode="ExecuteURL" />
      <error
        statusCode="404"
        path="/Error/HttpError404"
        responseMode="ExecuteURL" />
      <error
        statusCode="500"
        path="/Error/HttpError500"
        responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>
0 голосов
/ 14 сентября 2018

В web.config добавить эту строку

<system.web>
    <customErrors mode="On" defaultRedirect="~/ErrorHandler/Index">
        <error statusCode="404" redirect="~/ErrorHandler/NotFound"/>
    </customErrors>
<system.web/>

edit: Это должно охватывать все ошибки с этим кодом ... но я вижу, что у вас это уже есть.

...