GVKun编程网logo

使用[JsonConvert()]时,JSON.Net引发StackOverflowException(json convert failed)

12

这篇文章主要围绕使用[JsonConvert和]时,JSON.Net引发StackOverflowException展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用[JsonConvert的优

这篇文章主要围绕使用[JsonConvert]时,JSON.Net引发StackOverflowException展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用[JsonConvert的优缺点,解答]时,JSON.Net引发StackOverflowException的相关问题,同时也会为您带来.net – PresentationCore.dll中出现’System.StackOverflowException’、asp.net – 导致StackOverflowException的Sitecore控制器渲染、asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus、asp.net-mvc – 为什么在Razor中使用Html.RenderAction时会出现StackOverflowException?的实用方法。

本文目录一览:

使用[JsonConvert()]时,JSON.Net引发StackOverflowException(json convert failed)

使用[JsonConvert()]时,JSON.Net引发StackOverflowException(json convert failed)

我将这些简单的代码写为Serialize类,以使其扁平化,但是当我使用[JsonConverter(typeof(FJson))]批注时,它将引发
StackOverflowException 。如果我SerializeObject手动拨打电话,它可以正常工作。

如何在注释模式下使用JsonConvert:

class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.id = 1;
            a.b.name = "value";

            string json = null;

            // json = JsonConvert.SerializeObject(a,new FJson()); without [JsonConverter(typeof(FJson))] annotation workd fine
            // json = JsonConvert.SerializeObject(a); StackOverflowException

            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

    //[JsonConverter(typeof(FJson))] StackOverflowException
    public class A
    {
        public A()
        {
            this.b = new B();
        }

        public int id { get; set; }
        public string name { get; set; }
        public B b { get; set; }
    }

    public class B
    {
        public string name { get; set; }
    }

    public class FJson : JsonConverter
    {
        public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
        {
            JToken t = JToken.FromObject(value);
            if (t.Type != JTokenType.Object)
            {
                t.WriteTo(writer);
                return;
            }

            JObject o = (JObject)t;
            writer.WriteStartObject();
            WriteJson(writer,o);
            writer.WriteEndObject();
        }

        private void WriteJson(JsonWriter writer,JObject value)
        {
            foreach (var p in value.Properties())
            {
                if (p.Value is JObject)
                    WriteJson(writer,(JObject)p.Value);
                else
                    p.WriteTo(writer);
            }
        }

        public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override bool CanConvert(Type objectType)
        {
            return true; // works for any type
        }
    }

.net – PresentationCore.dll中出现’System.StackOverflowException’

.net – PresentationCore.dll中出现’System.StackOverflowException’

我有一个 WPF UserControl,我尝试在其中实现自定义MouseClick(因为WPF(用户)控件上没有MouseClick事件)事件.

我得到以下内容:

一些代码:

/// <summary>
/// Occurs when users left clicks the MyControl.
/// </summary>
public event MouseButtonEventHandler MouseClick { add { AddHandler(MouseClickEvent,value); } remove { RemoveHandler(MouseClickEvent,value); } }

    protected virtual void OnMouseClick(MouseButtonEventArgs e)
    {
        base.RaiseEvent(e);
        //this.RaiseEvent(new RoutedEventArgs(MouseClickEvent,this));
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);
        if (!this.movedAfterMouseDown)
        {
            OnMouseClick(e);
        }
        this.gotLeftButtonDown = false;
        this.movedAfterMouseDown = false;
    }

那么,问题出在哪里?

更新1

protected virtual void OnMouseClick(MouseButtonEventArgs e)
{
    //base.RaiseEvent(e);
    MouseButtonEventArgs args = new MouseButtonEventArgs(e.MouseDevice,e.Timestamp,e.ChangedButton);
    this.RaiseEvent(args);
}

值不能为空.
参数名称:routedEvent

更新2

我成功实现的其他自定义事件(没有问题的工作) – SelectedChanged:

static void OnIsSelectedChanged(DependencyObject source,DependencyPropertyChangedEventArgs e)
{
    var s = (MyControl)source;

    s.RaiseEvent(new RoutedEventArgs(SelectedChangedEvent,s));
}

更新3

System.Windows.Controls.Control的OnPreviewMouseDoubleClick实现:

protected virtual void OnPreviewMouseDoubleClick(MouseButtonEventArgs e)
{
    base.RaiseEvent(e);
}

更新5(对于坦克中的人)

class Foo : FrameworkElement
{
    event EasterCameEvent; // I named it MouseClick

    public DoSomething()
    {
        EasterCameArgs args= ...

        if (Date.Now = EasterDate)
            OnEasterCame(args)
    }

    protected virtual void OnEasterCame(EasterCameArgs e)
    {
        base.RaiseEvent(e);
    }
}

解决方法

protected virtual void OnMouseClick(MouseButtonEventArgs e)
{
    MouseButtonEventArgs args = new MouseButtonEventArgs(e.MouseDevice,e.ChangedButton);

    // Don't forget this
    args.RoutedEvent = MouseClickEvent;

    base.RaiseEvent(args);
}

asp.net – 导致StackOverflowException的Sitecore控制器渲染

asp.net – 导致StackOverflowException的Sitecore控制器渲染

我正在尝试使用Sitecore 8进行简单的控制器渲染,并且由于某种原因,它在主布局标记内的行上产生了一个StackOverflowException,其中包含对要呈现的占位符的引用.这似乎会使工作进程崩溃,但是你可以在调试过程时看到堆栈溢出:

这是我非常基本的控制器:

这是我的控制器渲染定义:

复制说明:

>这是在一个vanilla Sitecore 8安装(通过SIM安装的版本150427)中发生的.
> MVC项目也是使用空的ASP.NET项目创建的,然后是MVC 5.1中的NuGetting.
> Web.config& Global已从wwwroot中的Sitecore站点根目录添加到项目中.

仅供参考 – 在进行视图渲染时,一切都非常好 – 它只是导致问题的控制器渲染

解决方法

所以问题实际上最终非常简单.

当视图作为局部视图(所有Sitecore渲染都是)时返回ViewResult,那么必须将标记中的layout属性设置为null:

@{
    Layout = null;
}

否则MVC将尝试将布局文件包装在其周围,当然这包含您的Sitecore占位符,这会导致无限循环并使用StackOverflowException崩溃工作进程.

因此,在Sitecore的上下文中,返回PartialViewResult或返回ViewResult,并将布局设置为null.

asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus

asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus

简短版本

我想要一个Adplus脚本,在任何事情被清理之前,首次碰巧StackOverflowException将完成内存转储,并忽略所有其他异常类型。

日志版本

在发布新的ASP.NET代码之后,我们开始获取间歇性StackOverflowExceptions。我们已经寻找无限递归和自上次已知的安装以来添加的修订版本中的所有常见疑犯,并且找不到任何内容。该网站将运行长达一个小时,然后崩溃。

我们已经使用WinDbg和SOS,并尝试使用Adplus获取崩溃日志,使用以下命令:

adplus -crash -o D:\Crash -NoDumpOnFirst -iis

-NoDumpOnFirst的原因是我们只能在繁忙的服务器上重现生产中的错误。为了在每个第一次机会异常(嘿,它发生)做一个minidump调试器必须暂停IIS工作进程足够长的时间写出一个16兆文件,所以请求排队,应用程序变得不稳定。因为这个错误可能需要一个小时的时间才能让人头痛,所以这是有问题的。

所以使用-NoDumpOnFirst,我得到一个转储文件,WinDbg输出这些线程为:

PDB symbol for mscorwks.dll not loaded
ThreadCount: 69
UnstartedThread: 0
BackgroundThread: 69
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                      PreEmptive   GC Alloc           Lock
       ID OSID ThreadobJ    State     GC       Context       Domain   Count APT Exception
XXXX    1  c6c 000fa758  11808221 disabled 3b49ee4c:3b49efe8 00120888     1 Ukn (Threadpool Worker)
XXXX    2 1294 000fd258      b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Finalizer)
XXXX    3 1eb0 0011cdd0    80a220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Completion Port)
XXXX    4 1b3c 00120198      1220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX    5 1280 00138118   880a220 Enabled  2633de9c:2633ee08 000df4e0     0 Ukn (Threadpool Completion Port)
XXXX    6 1db8 00158a48  1180a221 disabled 4b5a7e2c:4b5a82e8 00120888     1 Ukn (Threadpool Worker)
XXXX    9 141c 00162008   180a220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX    7 1574 00174008   180a220 Enabled  4d46b6a8:4d46c158 00120888     2 Ukn (Threadpool Worker)
XXXX    c 16c8 0016b7a8   180a220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX    8 1384 00162878   180a220 Enabled  284e26a4:284e45d8 000df4e0     0 Ukn (Threadpool Worker)
XXXX    b 1c10 0016b3d8   180a220 Enabled  3ed2dae0:3ed2dfe8 00120888     2 Ukn (Threadpool Worker)
XXXX    a 1814 0016b008   180a220 disabled 28816384:28816638 00120888     1 Ukn (Threadpool Worker)
XXXX    d  1fc 1b4d1ff0       220 Enabled  319f89a4:319fa41c 000df4e0     0 Ukn
XXXX    e 1864 1b4e3d20   180b220 Enabled  4b2c5be0:4b2c6150 000df4e0     0 Ukn (Threadpool Worker)
XXXX    f 13bc 1b57caf8   200b220 Enabled  4cc71584:4cc73414 00120888     1 Ukn
XXXX   10  72c 1f5124a8   180b220 Enabled  3b4b3414:3b4b4fe8 00120888     2 Ukn (Threadpool Worker)
XXXX   11 1fd0 1f526398   180b220 disabled 4d46f41c:4d470158 00120888     1 Ukn (Threadpool Worker)
XXXX   12 1f10 1f52f1c8   180b220 Enabled  28812c14:28814638 00120888     2 Ukn (Threadpool Worker)
XXXX   13 1b84 1f53a420       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   14 18a4 1f570978   180b220 Enabled  263e18b4:263e2e28 000df4e0     0 Ukn (Threadpool Worker)
XXXX   15 1a98 1f57f0a0   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   16  1b4 1f583628   180b220 Enabled  495781ec:4957914c 00120888     2 Ukn (Threadpool Worker)
XXXX   17  b90 1f585dc8   180b220 Enabled  265cbe48:265ccba4 000df4e0     0 Ukn (Threadpool Worker)
XXXX   18 1590 1f613c60       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   19 1850 1f5fad90       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   1a  c78 1f60d3f0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   1c 1bd8 2121f1b0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   1d  494 1b4a8c10       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   1e  898 2120f120       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   1f 1820 21355ff8       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   20 15b0 3570e120       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   21 18b0 359ca008       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   22  75c 35a58948       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   25 1a18 213ac8f8   880b220 disabled 3219a830:3219b450 00120888     1 Ukn (Threadpool Completion Port) System.StackOverflowException (0e3200a4)
XXXX   29 1b74 3598e620   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   2a  9b8 3598dbe0   180b220 Enabled  2880ef2c:28810638 000df4e0     0 Ukn (Threadpool Worker)
XXXX   2b 1eac 1f6f6288   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   2d  2f4 211759e8   180b220 disabled 2634eacc:2634ee08 00120888     1 Ukn (Threadpool Worker)
XXXX   2e 1e3c 35c2eb60   880b220 Enabled  4b5a5758:4b5a62e8 000df4e0     0 Ukn (Threadpool Completion Port)
XXXX   30  394 35c394f8   180b220 Enabled  4cef7930:4cef90d4 000df4e0     0 Ukn (Threadpool Worker)
XXXX   31 1e64 35c39128   180b220 disabled 288110b0:28812638 00120888     1 Ukn (Threadpool Worker)
XXXX   32 1af8 35a58578   180b220 Enabled  3b48e7cc:3b48efe8 000df4e0     0 Ukn (Threadpool Worker)
XXXX   34 1d44 1f6a6c88   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   35 197c 212088e0   180b220 Enabled  49389ba8:4938af40 000df4e0     0 Ukn (Threadpool Worker)
XXXX   36 1e2c 35c1d980       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   38 1ddc 212d03d8       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   39  288 212d0008       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   3a 1694 212bf958       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   3b  be4 212ccc40       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   37  ccc 35c4d6d0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   3c 14ec 35c55af0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   41 1d94 35c38c08   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   24  130 35746a50   180b220 Enabled  2670ae48:2670cc00 000df4e0     0 Ukn (Threadpool Worker)
XXXX   2f 1404 35c1d350   180b220 Enabled  00000000:00000000 000df4e0     0 Ukn (Threadpool Worker)
XXXX   43 1ae8 35c25cb8   180b220 disabled 3b4c28e0:3b4c2fe8 00120888     1 Ukn (Threadpool Worker)
XXXX   44 18ac 212cc870   180b220 disabled 4957e728:4957f14c 00120888     1 Ukn (Threadpool Worker)
XXXX   45 18b4 212bf588   180b220 disabled 3b4c05dc:3b4c0fe8 00120888     1 Ukn (Threadpool Worker)
XXXX   46 1c0c 21239858       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   47  4fc 21188b68       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   48 1198 35caa2a8       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   49 1f9c 21147af8       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   4a 1adc 35cc6908       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   4b  ce8 35c60e30       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   4d  6f0 35d05aa0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   4e 1ee8 35c1b6b0       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   42 1d7c 35d9a230       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   3d  7d8 212e1b28       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   23  c0c 503ea010       220 Enabled  00000000:00000000 000df4e0     0 Ukn
XXXX   27 1f44 503cdf08       220 Enabled  00000000:00000000 000df4e0     0 Ukn

尝试打印异常表明没有堆栈跟踪,其他方法抱怨它是非托管代码。我的猜测是,由于转储是在进程死亡时创建的,所有的线程都被垃圾收集,没有任何信息可以获取。

我真的希望调试器在StackOverflowException的第一次机会上执行完全转储,并忽略所有其他异常类型。我知道Adplus可以使用配置文件 – http://msdn.microsoft.com/en-us/library/cc409304.aspx – 但是格式对我来说都是希望。任何人都可以告诉我如何制作一个Adplus脚本呢?

…当然,如果你看上面的线程列表,你确切知道是什么问题,或者可以弄清楚,如果我给了你更多的信息,你也可以告诉我。

分辨率尝试1

谢谢你以下答案,这是不正确的,但推动我在正确的方向。堆栈溢出的异常代码是不正确的(这是sbo不是sov),(或者所以我以为在当时,看到以下的thinkok的编辑),所以我尝试调试与以下配置:

<Adplus>
   <!-- Add log entry,log faulting thread stack and dump full on first chance StackOverflow -->
<Exceptions>
     <Config>
        <!-- This is for the StackOverflow exception -->
       <Code> sbo </Code>
       <Actions1> Log;Stack;FullDump </Actions1>
       <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) -->
       <ReturnAction1> GN </ReturnAction1>
     </Config>
  </Exceptions>
</Adplus>

并使用以下命令:

adplus -crash -o D:\Crash -NoDumpOnFirst -c D:\Crash\stackoverflow.cfg -iis

我验证输出的日志文件指示了正确的配置。诀窍是adplus的命令行参数按顺序执行,所以如果您从配置中捕获第一次机会异常,然后应用-NoDumpOnFirst,配置设置将被覆盖。如果最后用-c应用配置,那么它的设置将会胜出。

然而,最后,堆栈溢出被证明是无法匹配的。堆栈溢出发生,不能收到内存转储,然后在第二次机会进程结束事件发生转储,并且一切都被垃圾收集,我无法获得任何有用的信息。

我试图使进程结束异常短路,以防万一引发和覆盖堆栈溢出,但是发生异常,我没有内存转储。

幸运的是,我通过检查代码绊倒了答案。当然是循环方法调用的一个例子。

实际决议

这个问题早已解决了,但是我很快就创建了一个ASP.NET页面,这将导致堆栈溢出。 (毕竟不难做),并尝试下面的Axl的回应。

XML稍微关闭 – Axl只是忘了关闭< / Adplus>标签(或probaby在复制粘贴中丢失它),但这很容易修复,adplus是足够好的告诉我什么是错误的。

我把这个脚本放在我的测试堆栈溢出抛出器上,加载了windbg的结果,当我打电话给clrstack时,我得到了一个非常清楚(和很长的)循环调用的方法列表。这将立即发现问题!我会把这个页面保留在书签下一次堆栈溢出敲我的门。

解决方法

为了防止这可能有助于别人,下面是我提出的 ADPlus配置文件。现在看看,我不知道,失控有什么影响。当引起StackOverflowException的ASP.NET应用程序正在运行时,这将在指定的OutputDir中生成“1st chance StackOverflow full”和“1st chance Process Shutdown full”.dmp文件。用 Windbg打开第一个文件,并运行“.loadby sos mscorwks”,然后运行“!clrstack”来查看可能导致堆栈溢出的情况。
<Adplus>
<Settings>
    <RunMode>CRASH</RunMode>
    <OutputDir>C:\Dumps</OutputDir>
    <ProcessName>w3wp.exe</ProcessName> 
</Settings>
<Exceptions>
    <Option>FullDumpOnFirstChance</Option>
    <Option>MiniDumpOnSecondChance</Option>
    <Option>NoDumpOnFirstChance</Option>
    <Option>NoDumpOnSecondChance</Option>
    <Config>
        <Code>AllExceptions</Code>
        <Actions1>Void</Actions1>
        <Actions2>Void</Actions2>
        <ReturnAction1>GN</ReturnAction1>
        <ReturnAction2>GN</ReturnAction2>
    </Config>       
    <Config>
        <!--
        av = AccessViolation
        ch = InvalidHandle
        ii = IllegalInstruction
        dz =  IntegerDivide
        c000008e = FloatingDivide
        iov = IntegerOverflow
        lsq = InvalidLockSequence
        sov = StackOverflowException
        eh = CPlusPlusEH
        * = UnkNownException
        clr = NET_CLR
        bpe = CONTRL_C_OR_Debug_Break
        ld = DLL_Load
        ud = DLL_UnLoad
        epr = Process_Shut_Down
        sbo = Stack_buffer_overflow
        -->
        <Code>sov;sbo</Code>
        <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1>
        <CustomActions1>!runaway</CustomActions1>
        <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2>
        <CustomActions2>!runaway</CustomActions2>
        <!--
        G = go
        GN = go unhandled exception
        GH = go handled exception
        Q = quit
        QD = quit and detach
        -->
        <ReturnAction1>GN</ReturnAction1>
        <ReturnAction2>GN</ReturnAction2>
    </Config>
    <Config>
        <Code>clr</Code>
        <Actions1>Void</Actions1>
        <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2>
        <ReturnAction1>GN</ReturnAction1>
        <ReturnAction2>GN</ReturnAction2>
    </Config>
    <Config>
        <Code>epr</Code>
        <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1>
        <Actions2>Void</Actions2>
        <ReturnAction1>GN</ReturnAction1>
        <ReturnAction2>GN</ReturnAction2>
    </Config>
</Exceptions>
</Adplus>

asp.net-mvc – 为什么在Razor中使用Html.RenderAction时会出现StackOverflowException?

asp.net-mvc – 为什么在Razor中使用Html.RenderAction时会出现StackOverflowException?

我正在将WebForms应用程序转换为Razor,除非我尝试使用 Html.RenderAction,否则一切正常.每当我调用它时,我得到一个StackOverflowException.有没有人知道可能导致这种情况的原因?

我的操作模板如下所示:

@model dynamic   

should be rendering this

在我的_Layout.cshtml文件中,我渲染这样的动作:

@{Html.RenderAction("MyPartialAction");}

我的_ViewStart.cshtml文件如下所示:

@{
    this.Layout = "~/Views/Shared/_Layout.cshtml";
}

解决方法

问题是您的操作模板没有定义要使用的布局.因此,它会自动获取_ViewStart.cshtml文件中指定的那个.这实际上会导致_Layout.cshtml文件无限制地嵌套在自身内.因此StackOverflowException.解决方案很简单.将操作模板中的布局设置为null:
@model dynamic
@{
   Layout = null;
}
should be rendering this

现在模板不会请求嵌入到布局文件中,一切正常.

关于使用[JsonConvert]时,JSON.Net引发StackOverflowException的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.net – PresentationCore.dll中出现’System.StackOverflowException’、asp.net – 导致StackOverflowException的Sitecore控制器渲染、asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus、asp.net-mvc – 为什么在Razor中使用Html.RenderAction时会出现StackOverflowException?的相关信息,请在本站寻找。

本文标签: