在安装Reactive Extensions后,将Newtonsoft Json与dynamic一起使用时出现Runti



我使用了以下代码:

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中遇到了这个确切的问题。

修复方法是在"工具">"选项">"调试">"常规"中启用"仅我的代码"。

相关内容

  • 没有找到相关文章

最新更新