저는 Azure 함수를 사용하여 이벤트 허브에서 메시지를 수집하고 Azure 알림 허브를 통해 알림을 보냅니다. 위대한 작품! 이제는 이러한 태그를 통해 사용자를 타겟팅 할 수 있도록 해당 메시지에 태그를 추가 할 수 있는지 확인하고 싶습니다.Azure 함수에 대한 알림 태그 구성
알림 허브의 출력에는 구성 할 수있는 "태그 식"매개 변수가 있습니다. 그러나 이것은 정적 인 텍스트 인 것 같습니다. 대신 이벤트 허브에서받은 메시지를 기반으로 이러한 태그를 동적으로 설정해야합니다. 동적 콘텐츠를 어떻게 든 넣을 수 있는지 확실하지 않습니다.
나는 또한 내가 사용하고있는 GcmNotification 개체의 생성자는 태그 문자열을 사용할 수있는 과부하가 있음을 발견했다. 그러나 내가 이것을 시도 할 때 컴파일 타임에 이것이 더 이상 사용되지 않는다고 경고하고, 함수가 실행될 때 Tag 속성이 비어 있어야하므로 오류를 보여줍니다.
그래서 나는 이것이 가능한지 여부와 그것이 가능할 때 어떻게하는지 명확하지 않습니다. 어떤 아이디어?
업데이트 : 제안대로 입력 문자열에 매핑 할 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 serialization이 사용됩니다. 1. 매개 변수 유형을 'RuleMessage'대신 'string'으로 바인딩하여 원시 값을 가져오고 JSON 비 직렬화 또는 을 피하십시오. 2. 유효한 json으로 대기열 페이로드를 변경하십시오. JSON 구문 분석기가 실패했습니다. 형식에 JSON 개체 (예 : { "name": "value"})가 필요하기 때문에 현재 제출 된 JSON 배열 (예 : [1,2,3])을 'Submission # 0 + RuleMessage'유형으로 deserialize 할 수 없습니다. 올바르게 deserialize하십시오. 이 오류를 수정하려면 JSON 객체를 JSON 객체 (예 : { "name": "value"})로 변경하거나 직렬화 해제 된 유형을 Array 또는 Collection 인터페이스 (예 : 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;
}
업데이트 28-6-2016 : 그것은 ASA 출력을 전환하여 내가 관리하지 않는 한 작업 얻을 것은이 JSON을 생성하지 않습니다에 구분 라인에 더 이상 배열. 이것은 임시 직원입니다. 출력에 두 줄 이상이 생기는 즉시 함수 바인딩이 실패하기 때문에 문제가 해결되었습니다.
어쨌든, 나는 지금 내가 그것을 변경 명령에 따라의 tagExpression을 설정하기 위해 진행 : {deviceid}
내 RuleMessage POCO에서의 DeviceID 속성을 동일
{
"type": "notificationHub",
"name": "notification",
"hubName": "repsaj-neptune-notifications",
"connection": "repsaj-neptune-notifications_NOTIFICATIONHUB",
"direction": "out",
"tagExpression": "deviceId:{deviceid}"
}
.불행하게도이 함수는 출력 함수를 호출 할 때 작동하지 않습니다.
함수를 실행하는 중 예외가 발생했습니다 : Functions.submerged-function-ruleout. Microsoft.Azure.WebJobs.Host : 예외 바인딩 매개 변수 '알림'. Microsoft.Azure.WebJobs.Host : 명명 된 매개 변수 'deviceid'에 값이 없습니다.
사실이 아니므로 출력 창에 기록한대로 속성이 설정되어 있는지 확인합니다. 나는 또한 {inputEventMessage.deviceid}와 같은 것을 시도했지만, 둘 중 하나가있을 때 런타임이 {inputid}를 올바른 입력 객체에 매핑하는 방법을 얻지 못했기 때문에 어느 것도 작동하지 않습니다.
입력 메시지가 하나의 특정 속성을 사용하려는 json 형식의 문자열을 포함하는 문자열 인 경우 어떻게해야합니까? – Jasper
Node.js 함수의 경우 이벤트 본문이 JSON 인 경우 바인딩 표현식에서 해당 속성을 참조 할 수 있습니다. C#을 사용하는 경우 입력에 매핑되는 POCO 클래스를 정의한 다음 바인딩 표현식에서 해당 POCO 속성을 참조 할 수 있습니다. 시도해보십시오 :) – mathewc
완료했지만 문제가 있습니다. 업데이트를 참조하십시오. – Jasper