安装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中遇到了这个问题。
解决方法是在工具>选项>调试>常规中启用“仅我的代码”。