2013-04-01 44 views
11

我試圖使用.NET 4.5的新regular expression match timeout,特別是全局變量通過AppDomain.CurrentDomain.SetData"REGEX_DEFAULT_MATCH_TIMEOUT"屬性(您傳遞的變體正則表達式構造函數TimeSpan工作正常)。全局正則表達式匹配超時適用於控制檯應用程序,但不適用於ASP.NET MVC應用程序

當我創建這個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/不會拋出異常,比賽繼續努力。 (如果你等待足夠長的時間,它會最終完成,然後抱怨缺少的觀點。這需要veeery長雖然)。

調用SetDataGlobal.asaxApplication_Start(),而不是內部的控制器動作不使超時發生。

+0

你可以嘗試初始化新的正則表達式對象http://msdn.microsoft.com/en-us/library/hh160196.aspx並嘗試設置匹配超時只爲這個正則表達式?如果它不會工作 - 我會建議你提交一個錯誤在https://connect.microsoft.com/ – outcoldman

+0

@outcoldman正如我在我的問題中所說,構造函數變種工作正常。 – balpha

回答

7

我猜這兩個示例之間的區別在於,控制檯應用程序第二行是第一次訪問RegEx對象,這是初始化此類型的位置。在MVC中 - 我的猜測是在Index操作之前使用了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$"); 

所以,你只需要確保你將別人會前初始化這個屬性用它。 您可以在httpRuntime部分中使用web.config:http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.defaultregexmatchtimeout.aspx指定此配置。

+0

哇,那是......意想不到的。與web.config工作的確如此 - 謝謝! – balpha

相關問題