Глобальное время ожидания повторного выражения работает в консольном приложении, но не в приложении ASP.NET MVC
Я пытаюсь использовать .NET 4.5 новое время ожидания регулярного выражения, в частности глобальный вариант через AppDomain.CurrentDomain.SetData
с "REGEX_DEFAULT_MATCH_TIMEOUT"
свойство (вариант, в котором вы передаете TimeSpan
конструктору регулярных выражений, отлично работает).
Когда я создаю новое консольное приложение с помощью этого основного метода:
static void Main(string[] args)
{
AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT",
TimeSpan.FromSeconds(3));
var m = System.Text.RegularExpressions.Regex.Match(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "^(x+x+)+y$");
}
работает так, как ожидалось: через три секунды он выбрасывает RegexMatchTimeoutException
.
Однако, если я создаю пустое приложение MVC 4, добавьте HomeController
и этот метод действий:
public ActionResult Index()
{
AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT",
TimeSpan.FromSeconds(3));
var m = System.Text.RegularExpressions.Regex.Match(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "^(x+x+)+y$");
return View();
}
и посетите http://localhost:XXXXX/
, никакое исключение не будет выбрано, и попытка совпадения продолжается. (Если вы подождете достаточно долго, он, в конце концов, закончится, а затем пожалуется на отсутствующий вид. Это займет много времени.)
Вызов SetData
в Global.asax
Application_Start()
вместо действия контроллера не делает тайм-аут также.
Ответы
Ответ 1
Я предполагаю, что разница между этими двумя образцами заключается в том, что во второй строке приложения Console Application есть первый доступ к объекту RegEx, и здесь вы инициализируете этот тип. В MVC - я предполагаю, что класс RegEx используется до вашего действия индекса.
Я попытался проверить это поведение с помощью простого консольного приложения и получил тот же результат, что и в MVC:
var m = System.Text.RegularExpressions.Regex.Match(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "x");
AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT",
TimeSpan.FromSeconds(3));
var m2 = System.Text.RegularExpressions.Regex.Match(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "^(x+x+)+y$");
Итак, вам просто нужно убедиться, что вы инициализируете это свойство, прежде чем кто-то еще его будет использовать.
Вы можете указать эту конфигурацию с помощью web.config: http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.defaultregexmatchtimeout.aspx в разделе httpRuntime.