我使用的是以下代码:
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:
{“'ExpandoObject'不包含以下定义
'成功'”}
服务返回的 json 如下所示:
{
"data": {
"sid": "sK7gyGm1kfEUc"
},
"success": true
}
我尝试删除响应式扩展引用,但这没有帮助。
那么这里发生了什么?
Update
我在VS2013中创建了一个新项目,并从原始解决方案中复制了源代码。
这就是解决方案中的所有代码,因为它只是一个游乐场解决方案。
然后,我使用 NuGet 添加了 JSON.NET 库(像以前一样),运行了该解决方案,它按预期工作。然后,我像以前一样通过 NuGet 添加反应式扩展库,并且该解决方案仍然按预期工作。我在任何时候都没有更改源代码(因为我在原始解决方案中还没有在代码中使用反应式扩展)
所以我不知道原始解决方案中的原因是什么(仍然不起作用)
Update 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 异常。我非常有信心,如果我将所有内容复制到新的解决方案中,它就会再次起作用。 (我会做的)
Update 3
所以现在我得到了停止工作的解决方案。我获取了 Program.cs 的全部内容(因为这只是一个用于测试的控制台应用程序)并将其复制到新的解决方案中。
通过 nuget 添加了包引用并执行了应用程序,它很简单。
因此,出于某种原因,视觉工作室似乎正在做一些阻止其工作的事情。
Update 4
对于不起作用的解决方案。如果我从 Visual Studio 中调试解决方案
但是,如果我打开 bin/Debug 目录并执行,我会收到 RuntimeBinderException
程序直接运行就好了。如果我从 Visual Studio 中运行解决方案
无需调试即可正常运行。因此,启用调试器时我遇到了问题。我还发现了另一个有类似问题的问题:使用 Newtonsoft.Json 解析 json 时出现 RuntimeBinderException