Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将JSON字符串解析为DynamicJsonObject的特定于机器的(??)行为_C#_Json_Visual Studio 2013 - Fatal编程技术网

C# 将JSON字符串解析为DynamicJsonObject的特定于机器的(??)行为

C# 将JSON字符串解析为DynamicJsonObject的特定于机器的(??)行为,c#,json,visual-studio-2013,C#,Json,Visual Studio 2013,我有一段代码在没有调试器的情况下按预期运行,但当我在调试器下运行它时,它在一台机器上工作,在另一台机器上失败。两台机器的设置几乎相同:Windows 8、.NET Framework 4.5、Visual Studio 2013终极更新4,我在两台机器上运行相同的控制台应用程序 代码解析包含JSON的字符串: {"success":true,"doAlternative":false,"errors":null,"content":null} 使用System.Web.Helpers将其转换为

我有一段代码在没有调试器的情况下按预期运行,但当我在调试器下运行它时,它在一台机器上工作,在另一台机器上失败。两台机器的设置几乎相同:Windows 8、.NET Framework 4.5、Visual Studio 2013终极更新4,我在两台机器上运行相同的控制台应用程序

代码解析包含JSON的字符串:

{"success":true,"doAlternative":false,"errors":null,"content":null}
使用System.Web.Helpers将其转换为动态对象:

dynamic result = Json.Decode(jsonString);
然后访问结果对象的
success
字段:

if ( result.success != true )
在一台机器上(我提醒:问题是在调试器下运行时),这一切正常。另一方面,我得到RuntimeBinderException:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException occurred
  _HResult=-2146233088
  _message='System.Web.Helpers.DynamicJsonObject' does not contain a definition for 'success'
  HResult=-2146233088
  IsTransient=false
  Message='System.Web.Helpers.DynamicJsonObject' does not contain a definition for 'success'
  Source=Microsoft.CSharp
  StackTrace:
       at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)
  InnerException: 
在“工作”机器上,当我在即时窗口中键入
result
时,我得到:

{System.Web.Helpers.DynamicJsonObject}
    base: {System.Web.Helpers.DynamicJsonObject}
在“失败”的机器上,我得到以下信息:

{System.Web.Helpers.DynamicJsonObject}
    base: {System.Web.Helpers.DynamicJsonObject}
    _values: Count = 4
这是最奇怪的一点:在故障机器上的即时窗口中播放,第一次键入
result[“success”]
会得到以下结果:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException occurred
  _HResult=-2146233088
  _message=Cannot apply indexing with [] to an expression of type 'System.Web.Helpers.DynamicJsonObject'
  HResult=-2146233088
  IsTransient=false
  Message=Cannot apply indexing with [] to an expression of type 'System.Web.Helpers.DynamicJsonObject'
  Source=Microsoft.CSharp
  StackTrace:
       at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)
  InnerException: 
然后,再次键入
result[“success”]
第二次,它就可以工作了!然后是
结果。成功也可以。它不会打扰我,但如果我不放置断点,只使用F5运行应用程序,它就会失败


这种特定于机器调试器的行为令人恐惧——我害怕将有此类问题的代码投入生产(目前只在调试器下观察到,但谁知道呢?)有人能解释一下吗?

好的,我找到了原因-。

转到工具>选项>调试和检查仅启用我的代码可以有效解决此问题

这个复选框正是这两种环境之间的区别。在“正在工作”的机器上尝试取消选中它,并在那里得到了相同的异常,因此我可以确认此行为是稳定和一致的(现在我很高兴)


因此,问题是只有调试器尝试跟踪正在调试的代码并读取动态对象的成员,而这些成员是创建动态对象的程序集的内部成员。这就是它在调试器下失败的原因,也是它在没有调试器的情况下运行时工作的原因。

能否提供一些有关执行上下文的信息(最好提供代码)?您是否异步/延迟解码JSON字符串?这是一个控制台应用程序,我的代码在Quartz.Net调度程序下运行,我相信它在常规线程池线程上运行。除此之外没什么特别的。它是一个机器人,可以自动化遗留应用程序,我发送HTTP请求,然后得到JSON字符串作为响应。然后我需要保存JSON字符串,以验证它是否将名为“success”的字段设置为“true”。我正在为这个问题添加一些代码。