我使用了以下代码:
public async Task<string> LoginAsync(string username, string password)
{
//removed irrelevant code from snippet
var response = await JSonConvert.DeSerializeObjectAsync<dynamic>(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:
{"展开对象"不包含的定义"成功"}
服务返回的json如下所示:
{
"data": {
"sid": "sK7gyGm1kfEUc"
},
"success": true
}
我已经尝试删除反应扩展引用,但这没有帮助。
那么这里发生了什么?
更新
我在VS2013中创建了一个新项目,并从原始解决方案中复制了源代码。这就是解决方案中的所有代码,因为它只是一个游乐场解决方案。
然后,我使用NuGet添加了JSON.NET库(和以前一样),运行了解决方案,它只是按预期工作。然后,我像以前一样通过NuGet添加了反应式扩展库,解决方案仍然像预期的那样工作。我在任何时候都没有更改源代码(因为我在原始解决方案中还没有使用代码中的反应扩展)
所以我不知道是什么导致了它在最初的解决方案中(仍然不起作用)
更新2
我多次运行该代码的工作版本,有时在没有更改任何内容的情况下,相同的RuntimeBinderException再次出现。
我已经检查了服务器的响应,它和以前完全一样。我所说的无关代码:
public async Task<string> 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<dynamic>(responseText);
return response.success == TRUE ? response.data.sid : String.Empty;
}
这是调用的第一个方法,现在最后一行再次抛出RuntimeBinder异常。我很有信心,如果我把所有东西都复制到一个新的解决方案中,它就会再次工作。
更新3
所以现在我得到了停止工作的解决方案。我把Program.cs的全部内容(因为这只是一个用于测试的控制台应用程序)复制到一个新的解决方案中。通过nuget添加了包引用并执行了应用程序,它很简单。
因此,似乎出于某种原因,视觉工作室正在做一些阻止它工作的事情。
更新4
对于不起作用的解决方案。如果我从Visual Studio中调试解决方案如果打开bin/Debug目录并执行程序直接运行起来很好。如果我在Visual Studio中运行解决方案在不进行调试的情况下,它运行得很好。因此,当调试器被启用时,我遇到了一个问题。我还发现了另一个类似问题:使用Newtonsoft.json 解析json时出现RuntimeBinderException
由于Json.NET或Rx-Main包在BCL之外都没有任何相互依赖关系,因此很难将包安装视为问题的根源。这是转移注意力。为了绝对确定,请检查bin输出中是否存在Rx-dll。
您的代码或其他内容发生了更改。您是否添加/删除了任何可能引入扩展方法问题的using语句?你确定代码根本没有改变吗?您是否确定服务响应相同?Json.NET包的版本是否已更改?
我的猜测是,在某个时刻,您的服务停止返回success属性,并且在您更改代码时巧合地再次开始返回它。
我在VS 2015中遇到了这个确切的问题。
修复方法是在"工具">"选项">"调试">"常规"中启用"仅我的代码"。