2016-05-02 7 views
0

をクラッシュオブジェクトダンパーを作るために私の試みです:リクエストにリフレクションを使用すると、ここでのw3wp.exeプロセス

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Text; 

namespace Inspector 
{ 
    public static class Inspector 
    { 
     public static string Inspect(this object o) 
     { 
      StringBuilder sb = new StringBuilder(); 
      InspectObject(o, sb); 
      return sb.ToString(); 
     } 

     private static void InspectObject(object o, StringBuilder sb) 
     { 
      Type objType = o.GetType(); 
      if (objType == typeof(string)) 
       sb.Append(o.ToString()); 
      else 
      { 
       try 
       { 
        IList<PropertyInfo> props = new List<PropertyInfo>(objType.GetProperties()); 

        foreach (PropertyInfo prop in props) 
        { 
         object propValue = null; 
         ParameterInfo[] ip = prop.GetIndexParameters(); 
         if (ip.Length == 0) 
         { 
          propValue = prop.GetValue(o, null); 
          InspectObject(propValue, sb); 
         } 
         else 
         { 

         } 
        } 
       } 
       catch (Exception ex) 
       { 
        sb.Append(string.Format("Exception: {0}", ex.Message)); 
       } 
      } 
     } 
    } 
} 

私はにHomeControllerのIndexメソッド、w3wp.exeのプロセスがクラッシュにRequestRequest.Inspect())を点検するためにそれを使用していますtry-catchブロックはその仕事をしません。

実際には何が起こっていますか?マイクロソフトでは、処理されていない例外だけがw3wp.exeをクラッシュさせると言いますが、私はRequest.Inspect()を親try-catchブロックにラップしています。

+2

StackOverflow(再帰の一般的な結果です)はプロセスをkillして捕まえられないことに注意してください。 –

答えて

1

Requestの正確なタイプがわからないので、HttpRequestクラスのドキュメントを読んだだけです。それはあなたが使用しているものではありません場合は、少なくとも私はあなたに何が起こっているかのアイデアを与えることができます。

  1. あなたはこのRequestContext
  2. そのプロパティのInspectObjectを呼び出すようHttpRequestクラスは、タイプRequestContextRequestContextと呼ばれる性質を持っていますタイプHttpContextBaseの性質HttpContextを持っているので、あなたは、このHttpContextBase現在あるタイプHttpRequestRequestというプロパティがあり
  3. そのプロパティにInspectObject呼び出しますリクエスト、そして - はい - あなたはそのプロパティのInspectObjectを呼び出し、再び1から始まることそれは

同じインスタンスだからだから、この再帰は決して停止しないと、あなたがStackOverflowExceptionを得るまで、あなたのコールスタックを埋めます。この種の例外は、スタック(およびプロセス全体)が既に破損しているため、catchブロックで処理できません。あなたは既に検査されたオブジェクトを検査しようとした場合を示しています再帰検出のいくつかの種類を必要とするこの問題を解決するには


。その後、その時点で再帰を停止することができます。
代わりに、特定の深さで再帰を停止することができます。具体的な解決方法は、その情報が必要なものによって異なります。

+0

'Request.RequestContext.HttpContext.Request!= Request'ですが、これは真実です。私は深度を10に制限し、プロセスはそれ以上クラッシュしません。 – Paul

関連する問題