【问题标题】:Configuring notification tag for Azure Function为 Azure Function 配置通知标记
【发布时间】:2016-10-26 16:11:58
【问题描述】:

我正在使用 Azure 函数从事件中心获取消息并通过 Azure 通知中心发送通知。效果很好!现在我想看看是否可以向这些消息添加标签,以便允许用户通过这些标签进行定位。

通知中心的输出具有您可以配置的“标记表达式”参数。但这似乎是一个静态文本。我需要根据从事件中心收到的消息动态设置这些标签。我不确定您是否可以以某种方式将动态内容放在那里?

我还发现我正在使用的 GcmNotification 对象的构造函数有一个允许使用标记字符串的重载。但是,当我尝试在编译时收到一条警告,说明不推荐使用此功能,并且当函数触发时,它会显示错误,因为 Tag 属性应该为空。

所以我不清楚a)这是否可能以及b)如果它是怎么做的。有任何想法吗?

更新:按照建议,我尝试创建一个 POCO 对象以映射到我的输入字符串。字符串如下:

[{"deviceid":"repsaj-neptune-win10pi","readingtype":"temperature1","reading":22.031614503139451,"threshold":23.0,"time":"2016-06-22T09:38:54.1900000Z"}]

POCO 对象:

public class RuleMessage
{
    public string deviceid;
    public string readingtype;
    public object reading;
    public double threshold;
    public DateTime time;
}

对于我现在尝试将RuleMessage[]List<RuleMessage> 作为参数类型的函数,但该函数抱怨它无法转换输入:

2016-06-24T18:25:16.830 执行函数时出现异常:Functions.submerged-function-ruleout。 Microsoft.Azure.WebJobs.Host:异常绑定参数“inputMessage”。 Microsoft.Azure.WebJobs.Host:将参数绑定到复杂对象(例如“RuleMessage”)使用 Json.NET 序列化。 1. 将参数类型绑定为 'string' 而不是 'RuleMessage' 以获取原始值并避免 JSON 反序列化,或者 2. 将队列有效负载更改为有效的 json。 JSON 解析器失败:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Submission#0+RuleMessage”,因为该类型需要 JSON 对象(例如 {"name":"value"})正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。也可以将 JsonArrayAttribute 添加到类型中以强制它从 JSON 数组中反序列化。

功能代码:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Azure.NotificationHubs;

public static void Run(List<RuleMessage> inputEventMessage, string inputBlob, out Notification notification, out string outputBlob, TraceWriter log)
{
    if (inputEventMessage == null || inputEventMessage.Count != 1)
    {
        log.Info($"The inputEventMessage array was null or didn't contain exactly one item.");

        notification = null;
        outputBlob = inputBlob;

        return;
    }

    log.Info($"C# Event Hub trigger function processed a message: {inputEventMessage[0]}"); 

    if (String.IsNullOrEmpty(inputBlob))
        inputBlob = DateTime.MinValue.ToString();

    DateTime lastEvent = DateTime.Parse(inputBlob);
    TimeSpan duration = DateTime.Now - lastEvent;

    if (duration.TotalMinutes >= 0) {
        notification = GetGcmMessage(inputMessage.First()); 
        log.Info($"Sending notification message: {notification.Body}");
        outputBlob = DateTime.Now.ToString();
    } 
    else {
        log.Info($"Not sending notification message because of timer ({(int)duration.TotalMinutes} minutes ago).");

        notification = null;
        outputBlob = inputBlob;
    }
}

private static Notification GetGcmMessage(RuleMessage input)
{
    string message;

    if (input.readingtype == "leakage")
        message = String.Format("[FUNCTION GCM] Leakage detected! Sensor {0} has detected a possible leak.", input.reading);
    else
        message = String.Format("[FUNCTION GCM] Sensor {0} is reading {1:0.0}, threshold is {2:0.0}.", input.readingtype, input.reading, input.threshold);

    message = "{\"data\":{\"message\":\""+message+"\"}}";

    return new GcmNotification(message);
}

public class RuleMessage
{
    public string deviceid;
    public string readingtype;
    public object reading;
    public double threshold;
    public DateTime time;
}

2016 年 6 月 28 日更新:我无法通过将 ASA 输出切换为行分隔使其不再生成 JSON 数组来使其正常工作。这是一个温度。修复,因为一旦输出中有超过一行(可能发生),函数绑定现在就会失败。

无论如何,我现在开始设置 tagExpression,按照我将其更改为:

{
  "type": "notificationHub",
  "name": "notification",
  "hubName": "repsaj-neptune-notifications",
  "connection": "repsaj-neptune-notifications_NOTIFICATIONHUB",
  "direction": "out",
  "tagExpression": "deviceId:{deviceid}"
}

{deviceid} 等于我的 RuleMessage POCO 上的 deviceid 属性。不幸的是,这不起作用,当我调用它输出的函数时:

执行函数时出现异常:Functions.submerged-function-ruleout。 Microsoft.Azure.WebJobs.Host:异常绑定参数“通知”。 Microsoft.Azure.WebJobs.Host:命名参数“deviceid”没有值。

这不是真的,我确定该属性已设置为我已将其记录到输出窗口。我也尝试了类似 {inputEventMessage.deviceid} 的方法,但这也不起作用(因为我不知道运行时如何将 {deviceid} 映射到正确的输入对象。

【问题讨论】:

    标签: azure azure-functions azure-notificationhub azure-eventhub


    【解决方案1】:

    tagExpression 绑定属性支持来自触发器输入属性的绑定参数。例如,假设您的传入事件中心事件具有属性AB。您可以使用括号语法在 tagExpression 中使用这些属性,例如:My Tag {A}-{B}

    通常,所有绑定类型中的大多数属性都以这种方式支持绑定参数。

    【讨论】:

    • 好的,但是如果我的输入消息是一个包含 json 格式字符串的字符串,我想从中使用一个特定属性怎么办?
    • 对于 Node.js 函数,如果事件主体是 JSON,您可以在绑定表达式中引用这些属性。如果您使用的是 C#,那么您应该定义一个映射到输入的 POCO 类,然后您可以在绑定表达式中引用这些 POCO 属性。试一试:)
    • 请分享您的函数定义。听起来您的函数已映射到单例 RuleMessage,但您正在发送数组输入。尝试发送 JSON 对象,而不是数组。
    • 我也会添加函数体。我会更改输入,但这来自事件中心,它从流分析中获取输入。我不知道需要什么来更改切换类型的位置。
    • 尝试将参数类型更改为 RuleMessage[]。各种绑定参数类型在 wiki 中有详细的here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2021-07-17
    相关资源
    最近更新 更多