如何从Azure API管理中的请求正文获取原始datetime值?

时间:2019-12-09 09:36:22

标签: c# azure azure-api-management

当前,我正在尝试访问Azure API管理中JSON属性的原始值。 我有以下要求:

{
   "date": "2019-12-09T12:00:00Z"
}

和类似的操作

    <inbound>
        <base />
        <!-- Assume datetime in format 2019-12-09T12:00:00Z -->
        <set-variable name="time" value="@(context.Request.Body.As<JObject>()["date"])" /> 
        <!-- Attempt to acquire raw value -->
        <set-variable name="rawValue" value="@{
            var value = JsonConvert.SerializeObject((JValue)context.Variables["date"]);
            return value.ToString();
        }" />
        <!-- raw value is: \"2019-12-09T12:00:00Z\" -->
    </inbound>

我在这里找到了类似的答案: JToken: Get raw/original JSON value 所以我尝试序列化对象。

但是在我的情况下,Azure API Management输出原始值,并带有如下附加报价:

set-variable (0 ms)
{
    "message": "Context variable was successfully set.",
    "name": "rawValue",
    "value": "\"2019-12-09T12:00:01Z\""
}

一种简单的方法是替换它们,但是没有更好的解决方案吗?

+++更新+++

刚刚找到了解决方案:

Convert.ToDateTime(context.Request.Body.As<JObject>()["date"]).ToString("o")

输出:

set-variable (0 ms)
{
    "message": "Expression was successfully evaluated.",
    "expression": "Convert.ToDateTime(context.Request.Body.As<JObject>()[\"date\"]).ToString(\"o\")",
    "value": "2019-12-10T09:10:00.0000000Z"
}

IMO这仍然不是我期望的100%,但至少它是正确的格式。 我仍然愿意寻求更好的解决方案。

2 个答案:

答案 0 :(得分:1)

随着即将发布的here即将发布的Azure API管理版本,应该可以指定他自己的 JsonSerializerSettings 并可以存储如下变量:

<set-variable name="body" value="@(context.Request.Body.AsJObject(preserveContent = true, new JsonSerializerSettings() { DateParseHandling = DateParseHandling.None } ))" /> 

部署后,我会立即发布更新,我可以设法对其进行测试。

更新

结合使用新的context.Request.Body.AsJObject()方法和JsonSerializer设置,现在将不再更改DateTime值的输出:

{
    "source": "set-variable",
    "timestamp": "2020-11-19T07:33:34.7901180Z",
    "elapsed": "00:00:00.0018103",
    "data": {
        "message": "Context variable was successfully set.",
        "name": "timestampFilter",
        "value": "2019-12-09T12:00:00Z"
    }
}

答案 1 :(得分:0)

您在这里完全混淆了类型。 using (var read = new FileStream(...返回包含字符串值context.Request.Body.As<JObject>()["date"]的JToken。调用2019-12-09T12:00:00Z时,您要求JSON.NET将给定的令牌序列化为字符串。字符串在JSON中用引号引起来的一系列字符表示,因此JsonConvert.SerializeObject((JValue)context.Variables["date"])当然等于value,即内部带有"2019-12-09T12:00:01Z"的字符串。如果只需要字符串值,请执行以下操作:

"