Глобальное время ожидания повторного выражения работает в консольном приложении, но не в приложении 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.