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

时间:2020-09-15 09:32:29

标签: 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时出现错误消息

消息正文不是有效的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 prepareContent)

您能帮我吗?

1 个答案:

答案 0 :(得分: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>