11

我正在尝试使用 .NET 4.5 的新正则表达式匹配超时AppDomain.CurrentDomain.SetData,特别是通过属性的全局变体"REGEX_DEFAULT_MATCH_TIMEOUT"(将 a 传递TimeSpan给正则表达式构造函数的变体工作正常)。

当我使用这个 main 方法创建一个新的控制台应用程序时:

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/没有抛出异常并且匹配尝试继续。(如果您等待的时间足够长,它最终会完成,然后抱怨缺少视图。不过,这需要长时间。)

调用's而不是在控制器操作SetData中调用也不会使超时发生。Global.asaxApplication_Start()

4

1 回答 1

8

我猜这两个示例之间的区别在于,在您的控制台应用程序中,第二行是对 RegEx 对象的第一次访问,这是您初始化此类型的地方。在 MVC 中 - 我猜想 RegEx 类是在您的 Index 操作之前使用的。

我尝试使用简单的控制台应用程序验证此行为,并得到与 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 部分。

于 2013-04-01T16:17:46.547 回答