我正在使用 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(使用前将#替换为@)