如何让 Azure Function 由 Azure Event Grid 触发?
How to make Azure Function triggered by Azure Event Grid?
我应该使用哪种触发器类型来运行 Azure 函数订阅 Azure 事件网格主题?
与事件网格相关的所有地方都提到了此功能,但我没有看到任何教程或代码示例。
可以为此目的使用通用 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
class 将事件 JSON 解析为 POCO
if
负责端点验证的块(事件网格要求)
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":"-----------"
}
}
最后一步是在集成页面中创建事件网格订阅Url:
我应该使用哪种触发器类型来运行 Azure 函数订阅 Azure 事件网格主题?
与事件网格相关的所有地方都提到了此功能,但我没有看到任何教程或代码示例。
可以为此目的使用通用 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
class 将事件 JSON 解析为 POCO if
负责端点验证的块(事件网格要求)
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":"-----------"
}
}
最后一步是在集成页面中创建事件网格订阅Url: