我正在使用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](布尔保留内容(
你能帮我吗?
不是最干净的解决方案,但考虑到您的需求,它是有效的。注意,我现在解析为下面的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>
如果我使用下面的,我会得到下面的错误。元素"set body"在第30行第15列出现错误:表达式中不支持使用类型为"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>