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