2013-04-01 22 views
11

.NETの新しいregular expression match timeoutを使用しようとしています。具体的にはAppDomain.CurrentDomain.SetData"REGEX_DEFAULT_MATCH_TIMEOUT"プロパティ正規表現のコンストラクタへのTimeSpanは正常に動作します)。 3秒後、それはRegexMatchTimeoutExceptionをスロー:それは期待どおりに動作グローバル正規表現のマッチタイムアウトは、コンソールアプリケーションでは動作しますが、ASP.NET MVCアプリケーションでは動作しません。

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

私はこのメインメソッドで新しいコンソールアプリケーションを作成

しかし、私はHomeControllerを追加し、空のMVC 4アプリを作成し、このアクションメソッド場合:

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を取ること。)

代わりに、コントローラのアクションがない内のGlobal.asaxApplication_Start()SetDataを呼び出しますタイムアウトを発生させます。

+0

新しい正規表現オブジェクトhttp://msdn.microsoft.com/en-us/library/hh160196.aspxを初期化し、この正規表現に対してのみマッチタイムアウトを設定できますか?それがうまくいかない場合 - 私はあなたにバグを提出することをお勧めしますhttps://connect.microsoft.com/ – outcoldman

+0

@outcoldman私の質問で言ったように、コンストラクタバリアントは正常に動作します。 – balpha

答えて

7

これらの2つのサンプルの違いは、コンソールアプリケーションの2行目が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$"); 

だから、あなたはちょうどあなたが他の誰かの意志の前に、このプロパティを初期化することを確認する必要がありますこれを使って。 この設定は、httpRuntimeセクションのweb.config:http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.defaultregexmatchtimeout.aspxで指定できます。

+0

うわー、それは...予期しない。実際にweb.configで動作します - ありがとう! – balpha

関連する問題