0

我正在使用 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 数组反序列化的 List。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} 映射到正确的输入对象,当有多个输入对象时。

4

1 回答 1

1

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

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

于 2016-06-24T15:19:46.307 回答