Разве плохо использовать ограничения на основе регулярных выражений? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть следующий маршрут, который будет широко использоваться на моем веб-сайте ASP.NET MVC:

    routes.MapRoute(
        null,
        "products/{ProductID}/{SeoName}",
        new { controller = "Product", action = "ProductDetails", SeoName = UrlParameter.Optional }
    );

Я хочу убедиться, что ProductID является действительным целым числом.Я знаю, что могу сделать это с помощью ограничения маршрута на основе регулярного выражения или с помощью специального ограничения маршрута, которое выполняет что-то вроде int.TryParse ().

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

Так что мой вопрос, должениспользовать ограничение маршрута на основе регулярного выражения или пользовательское ограничение маршрута, чтобы убедиться, что параметр является целым числом?

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Сэм Саффрон написал в блоге об оптимизации, которую он помог сделать на сайтах StackExchange.Одна из вещей, которые он сделал, - избавиться от как можно большего числа ограничений регулярных выражений.Заменить ограничения регулярных выражений пользовательской реализацией IRouteConstraint довольно просто, если вам просто нужно убедиться, что что-то является целым числом.В посте Сэма есть пример кода, который он использовал для этой самой вещи.Проверьте это здесь: http://samsaffron.com/archive/2011/10/13/optimising-asp-net-mvc3-routing

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

0 голосов
/ 02 марта 2012

Хотя я не совсем уверен, как работает механизм регулярных выражений .Net в отношении простых регулярных выражений, подобных этому, - как известно из курсов CS, Finite Automaton может распознавать обычные языки в линейном времени.Чтобы определить, является ли строка числом, вам необходимо в любом случае посетить каждый символ строки, поэтому теоретически это не должно иметь большого значения.

Однако, как указано в одном из других ответов, это может бытьвероятно, что что-то вроде Int32.TryParse более оптимизировано для этого (каким-то странным образом) и, как таковое, может быть немного быстрее.

Но скомпилированное регулярное выражение действительно должно подойти любому среднему пользователю, если только реализациядвижка регулярных выражений абсолютно ужасно.Конечно, это предполагает, что ваше регулярное выражение на самом деле распознает обычный язык (т. Е. Смотреть вперед и смотреть за спиной - это ненулевое значение, и ваше регулярное выражение не может вызвать какой-либо вид обратного отслеживания) - что проверяет целое число.

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

...