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

标签 c# azure azure-api-management

我正在使用 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 时出现以下错误

The message body is not a valid JSON. Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 1, position 1.

at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings)
at Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.AsJObject(Stream stream, Encoding encoding, JsonSerializerSettings settings)
at Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.As[T](Boolean preserveContent)

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

最佳答案

不是最干净的解决方案,但可以考虑您的要求。请注意,我现在正在解析为下面的 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>

关于c# - 检查context.Request.Body的条件是azure api管理策略中的JArray或JObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63899022/

相关文章:

azure - SQL Azure 数据同步与标准异地复制

azure-api-management - Azure Api 管理是否可以禁用订阅 key

c# - Word 文档中的 Excel 范围在更新链接后不保留格式

c# - 微软图: Invalid batch payload format

c# - 当前时间在 WPF DLL 中不起作用

azure - 经典虚拟机和 Azure 中的虚拟机有什么区别?

azure - 管理 Azure WebApp 部署槽和 API Manager

azure - 如何在 APIM 策略中定义数组变量

c# - Linq 外键 |如何只显示具有特定外键的元素?

C# 正则表达式匹配标题中的名称和电子邮件