2013-04-01 15 views
11

Próbuję użyć nowego regular expression match timeout .NET 4.5, w szczególności wariantu globalnego, za pośrednictwem AppDomain.CurrentDomain.SetData z właściwością "REGEX_DEFAULT_MATCH_TIMEOUT" (wariant, w którym można przejść a TimeSpan do konstruktora regex działa poprawnie).Limit czasu dopasowywania globalnego wyrażenia działa w aplikacji konsolowej, ale nie w aplikacji ASP.NET MVC

Kiedy utworzyć nową aplikację konsoli z tym główne metody:

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$"); 
} 

to działa zgodnie z oczekiwaniami: Po trzech sekundach, to rzuca RegexMatchTimeoutException.

Jednakże jeśli utworzyć pusty MVC 4 aplikację, dodać metodę HomeController i to działanie:

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(); 
} 

i odwiedzić http://localhost:XXXXX/ żaden wyjątek i próba mecz trwa. (Jeśli poczekasz wystarczająco długo, to będzie ostatecznie zakończyć, a potem narzekają brakującego widzenia. To trwa baaardzo długo.)

nazywając SetData w Global.asax „s Application_Start() zamiast zasięgu działania kontroler nie sprawiają, że limit czasu również się zdarzyć.

+0

Czy możesz spróbować zainicjować nowy obiekt regex http://msdn.microsoft.com/en-us/library/hh160196.aspx i spróbować ustawić Czas dopasowywania tylko dla tego wyrażenia regularnego? Jeśli to nie zadziała - zaproponuję zgłoszenie błędu na https://connect.microsoft.com/ – outcoldman

+0

@ outcoldman Jak już powiedziałem w moim pytaniu, wariant konstruktora działa dobrze. – balpha

Odpowiedz

7

Domyślam się, że różnica między tymi dwoma próbkami polega na tym, że w aplikacji Konsola druga linia to pierwszy dostęp do obiektu RegEx i to jest miejsce, w którym zainicjowano ten typ. W MVC - przypuszczam, że klasa RegEx jest używana przed akcją indeksu.

próbowałem zweryfikować to zachowanie z prostą aplikację konsoli i mam taki sam wynik jak miałeś w 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$"); 

Więc, po prostu trzeba się upewnić, że będzie zainicjować tę właściwość, zanim ktoś inny Użyj tego. Możesz określić tę konfigurację za pomocą pliku web.config: http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.defaultregexmatchtimeout.aspx w sekcji httpRuntime.

+0

Wow, to ... nieoczekiwane. Działa z web.config rzeczywiście - dzięki! – balpha

Powiązane problemy