【问题标题】:Condition to check context.Request.Body is JArray or JObject in azure api management policy在 azure api 管理策略中检查 context.Request.Body 的条件是 JArray 或 JObject
【发布时间】:2020-09-15 09:32:29
【问题描述】:

我正在使用 Azure API 管理策略表达式将供应商值发送到每个帖子,向后端 API 发送和删除请求。我编写了一个代码,当请求类型为 JObject 时运行良好。但在某些情况下,请求可以是 JArray 类型,在这种情况下会引发 500 错误。下面的 sn-p 适用于 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(流流,编码编码,JsonSerializerSettings 设置)
在 Microsoft.WindowsAzure.ApiManagement.Proxy.Gateway.MessageBody.As[T](Boolean preserveContent)

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

【问题讨论】:

    标签: c# azure azure-api-management


    【解决方案1】:

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

    【讨论】:

    • @bunty-choudhary ,你能用上面的方法解决吗?
    • 您是否知道以上内容是否应该使用多部分形式作为有效负载?
    【解决方案2】:

    如果我使用 below ,我会得到以下错误。 第 30 行第 15 列元素“set-body”中的错误:表达式中不支持使用“System.Object”类型的成员“ToString”

    我的出站政策如下所示。

     <outbound>
        <base />
        <return-response>
            <set-status code="200" reason="Success" />
            <set-header name="Accept-Encoding" exists-action="override">
                <value>deflate</value>
            </set-header>
            <set-header name="WWW-Authenticate" exists-action="override">
                <value>PatientID Received="PatientKey0001"</value>
            </set-header>
             <set-body>@{ 
                         JToken body = context.Request.Body.As<JToken>();
                         if (body.Type == JTokenType.Array)
                         {
                             
                         }
    
                         if (body.Type == JTokenType.Object)
                         {
                            
                         }
                         
                         return context.Request.Body.ToString();
                       }
            </set-body>
        </return-response>
    </outbound>
    

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多