Как обрабатывать недостающие файлы на MVC - PullRequest
0 голосов
/ 21 марта 2010

Какой способ обработки обращений к файлам, которых нет в вашем приложении MVC, является вашим предпочтительным.

У меня есть несколько веб-приложений, работающих с MVC, и они постоянно получают хиты для папок с файлами и т. Д., Которых нет в структуре приложения.

Приложения генерируют исключение: не найден контроллер для пути или он не реализует IController

Я пытаюсь найти лучший способ справиться с этим.

У меня есть 3 глобальных маршрута в моем файле global.asax (см. Ниже), и на данный момент я доволен этим простым определением. Я знаю, если я добавлю определение маршрута для всех контроллеров, тогда я могу добавить определение, чтобы игнорировать остальные и обрабатывать эти попадания, но если удастся решить эту проблему без него, я не хочу добавлять определения маршрутов для каждого контроллера, который Поверьте, затопит определения маршрута, а также добавит слой обслуживания, который мне не нравится.

//Aggregates 2nd level
            routes.MapRoute(
                "AggregateLevel2",
                "{controller}/{action}/{id}/{childid}/{childidlevel2}",
                new { controller = "Home", action = "Index", id = "", childid = "", childidlevel2 = "" }
            );

            //Aggregates 1st level
            routes.MapRoute(
                "AggregateLevel1",
                "{controller}/{action}/{id}/{childid}",
                new { controller = "Home", action = "Index", id = "", childid = "" }
            );

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );

Ответы [ 2 ]

0 голосов
/ 22 марта 2010

Это может быть неправильный способ сделать это, но на моем частном сайте это есть в файле global.asax;

    protected void Application_Error(object sender, EventArgs e)
    {
        HttpException httpException = Server.GetLastError() as HttpException;
        RouteData routeData = new RouteData();

        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "Index");
        routeData.Values.Add("statusCode", httpException.GetHttpCode().ToString());

        Server.ClearError();

        IController errorController = new MyDomain.Controllers.ErrorController();

        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }

Тогда у меня есть контроллер ошибок;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        //log out the error
        //string statusCode = RouteData.Values["statusCode"].ToString();

        return RedirectToAction("Index", "Home");
    }

}

Поэтому я всегда возвращаю пользователя на свою индексную страницу при возникновении ошибки.

Это только частный сайт, поэтому я могу воспользоваться многими свободами, и я считаю, что чем меньше вы показываете желтый экран и чем меньше информации вы даете потенциальным хакерам, тем лучше.

0 голосов
/ 21 марта 2010

В общем, это действительная ошибка, которую вы действительно хотите просто не получить желтый экран смерти.

Хорошая новость в том, что это легко. В вашем web.config есть тег customErrors, который, вероятно, (если вы его не изменили) имеет режим, установленный на remoteOnly. Если это так, то обработчик пользовательских ошибок ASP.net уже будет иметь дело с ошибочными запросами, подобными , когда запрос не приходит с localhost . Если вы хотите увидеть такое поведение, когда вы работаете на своем устройстве dev, работающем локально, измените режим на «Вкл».

Поведение «из коробки» заключается в обработке ошибки на контроллерах с применением атрибута HandleError. Это работает довольно хорошо, и вы можете по-разному обрабатывать различные ошибки, передавая argumetns этому атрибуту. Обычно атрибут просто выводит информацию об ошибке в представление Error.aspx (по умолчанию расположенное в вашей общей папке), которое просто выдает плоское утверждение о том, что произошла ошибка.

Какое поведение вы ищете, может потребовать от вас всего этого изменить, и в этом случае вы либо создадите свой собственный атрибут, который наследуется от IExceptionFilter, и сделаете то, что вы хотите внутри него.

Кроме того, всегда есть возможность переопределить OnError приложения либо в global.asax, либо в модуле, как в обычном ASP.Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...