如何使Azure Event Grid触发Azure功能?

时间:2017-10-05 15:19:58

标签: azure azure-functions azure-eventgrid

我应该使用哪种触发器类型来运行Azure功能作为Azure Event Grid主题的订阅?

此功能在与Event Grid相关的所有地方都有提及,但我没有看到任何教程或代码示例。

2 个答案:

答案 0 :(得分:4)

为此可以使用Generic Webhook触发器。

这是一个示例函数。

function.json

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "webHookType": "genericJson",
      "name": "req"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ],
  "disabled": false
}

C#实施:

#r "Newtonsoft.Json"

using System;
using System.Net;
using Newtonsoft.Json;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    string jsonContent = await req.Content.ReadAsStringAsync();
    var events = JsonConvert.DeserializeObject<GridEvent[]>(jsonContent);

    if (req.Headers.GetValues("Aeg-Event-Type").First() == "SubscriptionValidation")
    {
        var code = events[0].Data["validationCode"];
        return req.CreateResponse(HttpStatusCode.OK, new { validationResponse = code });
    }

    // Do whatever you need with events    
    foreach (var e in events)
        log.Info(e.Id);

    return req.CreateResponse(HttpStatusCode.OK);
}

public class GridEvent
{
    public string Id { get; set; }
    public string EventType { get; set; }
    public string Subject { get; set; }
    public DateTime EventTime { get; set; }
    public Dictionary<string,string> Data { get; set; }
    public string Topic { get; set; }
}

注意两件重要的事情:

  • 自定义GridEvent类,用于将事件JSON解析为POCO
  • 负责端点验证的
  • if块(事件网格要求)

答案 1 :(得分:4)

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Newtonsoft.Json;

namespace FunctionApp3
{
   public static class Function2
   {

      [FunctionName("Function2")]
      public static void Run([EventGridTrigger()]EventGridEvent eventGridEvent, TraceWriter log)
      {
        log.Info($"EventGridEvent\n\tId:{eventGridEvent.Id}\n\tTopic:{eventGridEvent.Topic}\n\tSubject:{eventGridEvent.Subject}\n\tType:{eventGridEvent.EventType}\n\tData:{JsonConvert.SerializeObject(eventGridEvent.Data)}");

      }
   }
}

使用azure门户网站:

run.cs:

#r "Microsoft.Azure.WebJobs.Extensions.EventGrid"
#r "Newtonsoft.Json"

using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Newtonsoft.Json;

public static void Run(EventGridEvent eventGridEvent, TraceWriter log)
{
    //log.Info(eventGridEvent.ToString());

    var jsondata = JsonConvert.SerializeObject(eventGridEvent.Data);
    var tmp = new { make = "", model = "", test = ""};   
    var data = JsonConvert.DeserializeAnonymousType(jsondata, tmp);

    log.Info($"Data = make:{data.make}, model:{data.model}, test:{data.test}");
    log.Info($"EventGridEvent\n\tId:{eventGridEvent.Id}\n\tTopic:{eventGridEvent.Topic}\n\tSubject:{eventGridEvent.Subject}\n\tType:{eventGridEvent.EventType}\n\tData:{jsondata}");   
}

function.json:

   {
     "bindings": [
     {
       "type": "eventGridTrigger",
       "name": "eventGridEvent",
       "direction": "in"
     }
    ],
    "disabled": false
   }

测试样本:

{
    "Topic": null,
    "Subject": "/myapp/vehicles/motorcycles",    
    "Id": "b68529f3-68cd-4744-baa4-3c0498ec19e2",
    "EventType": "recordInserted",
    "EventTime": "2017-06-26T18:41:00.9584103Z",
    "Data":{
      "make": "Ducati",
      "model": "Monster",
      "test":"-----------"
    }
 }

最后一步是在集成页面中创建一个Event Grid Subscription Url:

enter image description here