检查context.Request.Body的条件是azure api管理策略中的JArray或JObject

2023-12-28

我正在使用 Azure API 管理策略表达式将供应商值发送到每个帖子、对后端 API 的放置和删除请求。我编写了一个代码,当请求类型为 JObject 时,该代码工作正常。但我有一些请求可以是 JArray 类型的情况,在这种情况下它会抛出 500 错误。下面的代码片段对于 JObject 来说工作得很好。

    <set-variable name="Supplier" value="DummySupplier" />
    <choose>
        <when condition="@(new [] {"post", "put", "delete"}.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))">
            <set-body>@{ 
                         JObject body = context.Request.Body.As<JObject>(); 
                         body.Add(new JProperty("Supplier", ((string)context.Variables["Supplier"])));
                         return body.ToString(); 
                      }
            </set-body>
        </when>
    </choose>

我需要一个可以检查请求正文类型并进行相应解析的条件。否则,如果请求主体是 IEnumerable/JArray 类型,则上面的代码会给我错误。

当我有以下错误时IEnumerable在请求正文中

消息正文不是有效的 JSON。从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。路径 '',第 1 行,位置 1。

在Newtonsoft.Json.Linq.JObject.Load(JsonReader阅读器,JsonLoadSettings设置)
在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.AsJObject(Stream 流、Encoding 编码、JsonSerializerSettings 设置)
在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.As[T](布尔保留内容)

你能帮我解决这个问题吗?


不是最干净的解决方案,但可以考虑您的要求。请注意,我现在正在解析为下面的 JToken,它是 JObject 和 JArray 的基础。检查完类型之后再做事。

<set-variable name="Supplier" value="DummySupplier" />
    <choose>
        <when condition="@(new [] {"post", "put", "delete"}.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))">
            <set-body>@{ 
                         JToken body = context.Request.Body.As<JToken>();
                         if (body.Type == JTokenType.Array)
                         {
                             JObject newBody = new JObject();
                             newBody["OriginalArray"] = body;
                             newBody["Supplier"] = (string)context.Variables["Supplier"];                             
                             return newBody.ToString();
                         }

                         if (body.Type == JTokenType.Object)
                         {
                             body["Supplier"] = (string)context.Variables["Supplier"];
                             return body.ToString();
                         }
                         
                         return context.Request.Body.ToString();
                       }
            </set-body>
        </when>
    </choose>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查context.Request.Body的条件是azure api管理策略中的JArray或JObject 的相关文章

随机推荐

  • 如何使用 Xcode 和 Git 处理不同的库搜索路径?

    我正在和朋友一起开发一个应用程序 我们使用 git 私有 作为版本控制系统 我们面临的问题是 Xcode 5 1 DP2 给出此警告 Apple Mach O 链接器警告 未找到目录 出现此警告的原因是 Xcode 在我的硬盘上找不到我朋友
  • 在原则 2 中指定表类型/存储引擎

    那么如何在原则 2 中指定用于给定实体的存储引擎呢 我正在创建一个需要全文索引的表 并且只有 MyISAM 存储引擎支持 MySQL 中的全文索引 另一方面 看起来 Doctrine 2 不支持开箱即用的全文索引 也没有全文搜索 那是对的吗
  • ColdFusion 变量竞争条件?

    我需要一些帮助来确定为什么这个特定的代码在极少数情况下会产生竞争条件 我找到了一个解决方案 我也会概述它 但我真的很想理解它 我们有一个基于 CMS 的系统 由许多松散地基于保险丝盒模型的模块组成 一切都通过单个index cfm 运行 在
  • 为 docker 容器提供可路由的 IP 地址

    我在 ubuntu 14 04 上运行它并且已经设置docker0到静态 IP 然后通过防火墙从公共 IP 路由到该静态 IP 我正在尝试将后端 API 设置为在 docker 容器中运行 但对一些事情感到困惑 1 我将如何映射docker
  • 了解 C++ 中随机数生成器的种子是什么

    我有一个非托管 C 控制台应用程序 其中使用 srand 和 rand 我不需要这个来解决特定问题 但很好奇 传递给 srand 的原始种子是否存储在我可以查询的内存中的某个位置 有什么办法可以知道种子是什么吗 不需要存储种子 只需要存储最
  • Vuetify 中的颜色主题更改不起作用

    我将 vuejs 与 vuetify 一起使用 我放置了基本 vuetify 模板并尝试更改颜色主题 但颜色不会切换 我的控制台中没有出现任何错误 并且我的缓存也被清除 main js代码 import Vue from vue impor
  • VM 快照期间 BizTalk 与 SQL 的连接问题

    我们有一个用于 BizTalk 的虚拟机和一个用于 SQL 后端的单独虚拟机 我们使用 Veeam 进行备份 这基本上会启动虚拟机的快照 当此快照在 SQL VM 上最终确定时 应用程序服务器上的 BizTalk 服务将失败 通常它们会自动
  • 检测是否开启“蓝牙扫描”定位

    从 Android M 开始 如果您启用了蓝牙设备 即使全球定位已关闭 也可以在后台扫描蓝牙设备 蓝牙扫描位置设置中的选项 参见屏幕截图 为了扫描 BLE 设备 必须满足以下条件 COARSE LOCATION or FINE LOCATI
  • 使用 C# 将布尔数组转换为字符串

    我有一个看起来像这样的数组 status 0 true status 1 true status 2 false status 3 true 实际上它更大 但仍然小于 20 我需要将其转换为 ABD 其中每个 true 代表字母表中的一个有
  • 使用芯片输入选择不显示所选值

    我有一个选择 输入采用芯片格式 我尝试了所选值的控制台日志 效果很好 但由于某种原因 它没有显示在选择框中 我在这里做错了什么 handleChange event gt this setState badge event target v
  • Spring Boot中事务同步与Database+kafka示例

    我想使用 Spring boot 编写一个新应用程序 使用 MySQL Mango 数据库和 Spring Kafka 进行消息传递 我尝试使用 Many POC 来同步 Kafka 和 DB 之间的事务 但在某些情况下失败了 并且我还搜索
  • 如何访问 CGContext 以在屏幕外创建 CGLayer

    意图 创造CGLayer在屏幕外 从第二个线程在其上绘制一些复杂的东西 稍后使用它在主线程上快速绘制 Problem CGLayerCreateWithContext context size info 期望已经存在的CGContext这样
  • 如何在 ASP.net IIS 7.5 中利用浏览器缓存

    以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周内到期 http pagespeed googlelabs com http pagespeed googlelabs com建议我将此作为我的网站的高度优先事项 我正在使用 Wi
  • 用于 GUI 的 Java 2D 场景图形库

    我正在寻找用于构建 GUI 应用程序的 2D 场景图形库 它应该很快 使用 Java2D 并与 Swing 兼容 可嵌入 Swing 应用程序并显示 Swing 组件 对动画的支持是一个优点 您有使用某些图书馆的经验吗 有没有我错过的图书馆
  • Numpy 图像数组:如何有效地从 RGB 切换到 Hex

    我一直在使用嵌套 for 循环将 RGB 图像转换为十六进制值的图像数组 但对于大图像来说太慢了 有谁知道可以帮助我从 RGB 切换回 HEX 的快速方法和 或库 编辑 ragingSloth 这是我想出的 但对于我的需要来说太慢了 def
  • 如何在 Travis CI 上安装某些东西而不超时?

    我正在尝试测试 travis ci org 上构建的包 但 pip install scipy 遇到超时 Installing collected packages scipy Running setup py install for sc
  • 如何从 Excel 单元格获取完整值,而不是显示的(四舍五入)值?

    我在从工作表的单元格检索确切值时遇到问题 如果我打开文件 单元格有一个十进制数 仅显示 4 位小数 但如果我单击特定单元格 则该值会不同 有 6 位小数 我知道这是应用于单元格的设置 以便仅显示 4 位小数 现在我尝试使用 ClosedXM
  • WPF中如何移动焦点?

    我想知道是否有办法将焦点从当前控件移至 WPF 中 TabIndex 分配的控件上的其他控件 例子 我有 TabIndex 1 到 5 的控件 有没有办法将焦点从 1 跳转到 5
  • 从 C# 类设置 Gridview“标题”的样式

    我正在尝试在 C 文件中设置 ASP Net GridView 标题的样式 这是我返回样式化 GridView 的方法 private GridView setupGridView string caption var gview new
  • 检查context.Request.Body的条件是azure api管理策略中的JArray或JObject

    我正在使用 Azure API 管理策略表达式将供应商值发送到每个帖子 对后端 API 的放置和删除请求 我编写了一个代码 当请求类型为 JObject 时 该代码工作正常 但我有一些请求可以是 JArray 类型的情况 在这种情况下它会抛