Пользовательские ошибки в asp.net mvc

Стилизуем наши пользовательские ошибки:

  1. обработчики для mvc:
    <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
        <error statusCode="404" redirect="~/404.aspx"/>
        <error statusCode="500" redirect="~/500.aspx"/>
    </customErrors>
    

    mode=»On» — включает для локального и боевого серверов, mode=»RemoteOnly» — только для боевого сервера;
    redirectMode=»ResponseRewrite» — нужно чтоб url не менялся
    Внимание:путь должен быть указан начиная с ~/
    Внутри файла должен быть задан статус,  например статус 404

    <% Response.StatusCode = 404 %>
    
  2. обработчики для iis
    <httpErrors errorMode="DetailedLocalOnly">
        <remove statusCode="404"/>
        <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL"/>
        <remove statusCode="500"/>
        <error statusCode="500" path="/500.aspx" responseMode="ExecuteURL"/>
    </httpErrors>
    

    Внимание: путь должен указан без ~

  3. для своих ошибок переопределяем метод в контроллере
    protected override void OnException(ExceptionContext filterContext)
    {
        //If the exeption is already handled we do nothing
        /*if (filterContext.ExceptionHandled)
        return;*/
    
        Exception exc = filterContext.Exception;
        // определим статус
        Response.StatusCode = 500;
        if (exc is NotFoundException)
        {
            Response.StatusCode = 404;
        }
        else if (exc is BadRequestException)
        {
            Response.StatusCode = 400;
        }
        // -- -- --
        // в зависимости от запроса (обычный запрос, аякс запрос или запрос во фрейм) 
    отправляем html страницу или plain text. Запрос во фрейм использует плагин jquery ajaxFileUpload
        if (Request.IsAjaxRequest() || Request.QueryString["ajaxFileUpload"] != null)
        {
            filterContext.Result = new JsonResult()
            {
                Data = exc.Message,
            };
        }
        else
        {
            string controllerName = filterContext.RouteData.Values["controller"].ToString();
            string actionName = filterContext.RouteData.Values["action"].ToString();
            filterContext.Result = new ViewResult()
            {
                ViewName = "~/Views/Shared/Error.cshtml",
                ViewData = new ViewDataDictionary(filterContext.Controller.ViewData)
                {
                    Model = new System.Web.Mvc.HandleErrorInfo(exc, controllerName, actionName)
                }
           };
        }
        /*//Make sure that we mark the exception as handled
        filterContext.ExceptionHandled = true;*/
    }
    

    в этом методе убираем условие

    if (filterContext.ExceptionHandled)
    return;
    

    , так как filterContext.ExceptionHandled уже будет true из-за обработчиков определенных в customErrors (Не понятно почему !!!). В папке /Views/Shared/ обязательно должен быть файл _Layout.cshtml (Не понятно почему !!!).
    Пользовательские исключения пишем к примеру так:

    [Serializable]
    public class NotFoundException : Exception
    {
        public NotFoundException()
        {
        }
    }
    

    Представление выглядит так:

    @model HandleErrorInfo
    @{
      Layout = null;
      // определим заголовок страницы
      string pageTitle = "500 Ошибка на сервере";
      Response.StatusCode = 500;
      if (Response.StatusCode == 404)
      {
        pageTitle = "404 Страница не найдена";
      }
      else if (Response.StatusCode == 400)
      {
        pageTitle = "400 Отправлены плохие данные";
      }
    }
    
    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="utf-8" />
        <title>@pageTitle</title>
    </head>
    <body>
        <h1>@pageTitle</h1>
        @if (HttpContext.Current.IsDebuggingEnabled)
        {
            <h3>@Model.Exception.Message</h3>
            <pre>
            @Model.Exception.StackTrace
            </pre>
        }
    </body>
    </html>
    

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *