安装反应式扩展后动态使用 Newtonsoft Json 时出现 RuntimeBinderException

2023-12-05

我使用的是以下代码:

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


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

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

我的猜测是,在某个时候您的服务停止返回 success 属性,并且当您更改代码时巧合地开始再次返回它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安装反应式扩展后动态使用 Newtonsoft Json 时出现 RuntimeBinderException 的相关文章

  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中

随机推荐