0

저는 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}를 올바른 입력 객체에 매핑하는 방법을 얻지 못했기 때문에 어느 것도 작동하지 않습니다.

답변

1

tagExpression 바인딩 속성은 바인딩 매개 변수 트리거 입력 속성에서 오는 지원 예를 들어, 수신 이벤트 허브 이벤트 속성을 AB을 가지고 가정 당신은 괄호 구문, 예를 들어, 사용하여 tagExpression에서 이러한 속성을 사용할 수 있습니다... My Tag {A}-{B}

에서을 일반적으로 모든 바인딩 유형에서 대부분의 속성은 이런 식으로 바인딩 매개 변수를 지원합니다.

+0

입력 메시지가 하나의 특정 속성을 사용하려는 json 형식의 문자열을 포함하는 문자열 인 경우 어떻게해야합니까? – Jasper

+0

Node.js 함수의 경우 이벤트 본문이 JSON 인 경우 바인딩 표현식에서 해당 속성을 참조 할 수 있습니다. C#을 사용하는 경우 입력에 매핑되는 POCO 클래스를 정의한 다음 바인딩 표현식에서 해당 POCO 속성을 참조 할 수 있습니다. 시도해보십시오 :) – mathewc

+0

완료했지만 문제가 있습니다. 업데이트를 참조하십시오. – Jasper