使用请求上的反射崩溃w3wp.exe进程

时间:2016-05-02 16:47:13

标签: c# reflection crash w3wp

这是我尝试制作一个对象转储程序:

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方法中使用它来检查RequestRequest.Inspect())时,w3wp.exe进程崩溃并且try-catch块没有执行此操作&#39的工作。

实际发生了什么?微软表示,只有未处理的异常会导致w3wp.exe崩溃,但我正在调用Request.Inspect()包装到父try-catch块中;

1 个答案:

答案 0 :(得分:1)

我不确定你使用的chrome.extension.getBackgroundPage()的确切类型,所以我只读了HttpRequest类的文档。如果那不是你正在使用的,至少我可以让你知道发生了什么:

  1. Request类有一个名为HttpRequest的{​​{1}}类型的属性,因此您为该属性调用RequestContext
  2. RequestContext的属性InspectObject类型为RequestContext,因此您为该属性调用HttpContext
  3. HttpContextBase有一个名为InspectObject的{​​{1}}类型的属性,它是当前请求,而 - 是 - 您调用HttpContextBase该属性,从1.开始,因为它是同一个实例
  4. 所以这个递归永远不会停止,你填满你的调用堆栈,直到你得到Request。这种异常无法在HttpRequest块中处理,因为堆栈(以及整个过程)已经损坏。

    要解决此问题,您需要某种递归检测,告诉您是否尝试检查已检查过的对象。然后你可以在那一点停止递归 另外,您可以在一定深度停止递归。具体的解决方案取决于您需要的所有信息。