安装Reactive Extensions后使用Newtonsoft Json和动态时的RuntimeBinderException

我使用以下代码:

public async Task LoginAsync(string username, string password) { //removed irrelevant code from snippet var response = await JSonConvert.DeSerializeObjectAsync(responseText); return (response.success == SUCCESS ? response.data.sid : String.Empty); } 

在我通过NuGet安装Reactive Extensions之前,这一点很有用。
从该方法的最后一行开始,只需抛出一个RuntimeBinderException

{“’Newtonsoft.Json.Linq.JObject’不包含’成功’的定义”}

现在让它运行的唯一方法是使用它:

 return (response["success"].ToString() == SUCCESS ? response["data"]["sid"].ToString() : String.Empty); 

我尝试了另一个JSon库(JsonFX2.0),但我也得到了一个RuntimeBinderException:

{“’ExpandoObject’不包含’成功’的定义”}

服务返回的json看起来像这样:

 { "data": { "sid": "sK7gyGm1kfEUc" }, "success": true } 

我已经尝试删除Reactive Extensions引用,但这没有帮助。

那么这里发生了什么?

更新

我在VS2013中创建了一个新项目,并从原始解决方案中复制了源代码。 这就是解决方案中的所有代码,因为它只是一个游乐场解决方案。

然后我使用NuGet添加了JSON.NET库(如前所述),运行解决方案,它只是按预期工作。 然后我像以前一样通过NuGet添加了响应式扩展库,解决方案仍然按预期工作。 我没有在任何时候改变源代码(因为我在原始解决方案中没有使用代码中的反应式扩展)

所以我不知道在原始解决方案中导致它的原因(仍然不起作用)

更新2

我多次运行代码的工作版本,并且在某些时候没有更改任何相同的RuntimeBinderException再次弹出。

我检查了服务器的响应,它和以前完全一样。 我正在谈论的无关代码:

 public async Task LoginAsync(string username, string password) { var request = new Request(hostname, ApiName.SYNO_API_AUTH, 2, ApiPath.AUTHCGI, ApiMethod.LOGIN); request.AddParameter("account", username); request.AddParameter("passwd", password); request.AddParameter("format", "sid"); var responseText = await client.DownloadStringTaskAsync(request.ToString()); var response = await JsonConvert.DeserializeObjectAsync(responseText); return response.success == TRUE ? response.data.sid : String.Empty; } 

这是第一个被调用的方法,现在又一次,最后一行抛出了RuntimeBinderexception。 而且我非常有信心,如果我要将所有内容复制到一个新的解决方案,它将再次运作。 (我会这样做)

更新3

所以现在我已经找到了停止工作的解决方案。 我获取了Program.cs的全部内容(因为这只是一个用于测试的控制台应用程序)并将其复制到新的解决方案中。 通过nuget添加了包引用并执行了应用程序,它只是起作用。

所以看起来由于某种原因,visual studio正在做一些阻止它工作的东西。

更新4

对于不起作用的解决方案。 如果我在Visual Studio中调试解决方案,我得到RuntimeBinderException,但是,如果我打开bin / Debug目录并直接执行程序它运行正常。 如果我在Visual Studio中运行解决方案而没有调试它运行就好了。 所以我在调试器启用时遇到了问题。 我还发现了一个类似问题的另一个问题: 使用Newtonsoft.Json解析json时的RuntimeBinderException

由于JSON.NET或Rx-Main软件包在BCL之外都没有任何相互依赖关系,因此很难将软件包安装视为问题的根源。 这是一只红鲱鱼。 为了绝对确定,检查bin输出中没有Rx dll。

您的代码或其他内容已更改。 您是否添加/删除任何可能引入扩展方法问题的using语句? 你确定代码根本没有改变吗? 您确定服务响应是否相同? Json.NET软件包版本是否已更改?

我的猜测是,在某些时候你的服务停止返回成功属性,并且在你改变代码时巧合地再次开始返回它。

我在VS 2015中遇到了这个问题。

解决方法是在工具>选项>调试>常规中启用“仅我的代码”。