使用[EventGridTrigger]EventGridEvent作为参数时,Azure函数.NET5(隔离)抛出
c#
为 Azure Function 升级到 .NET5 后,此签名会引发以下异常。
我已经根据这里的文档实现了它https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-grid-trigger?tabs=csharp%2Cbash
[Function(nameof(CustomerCreated))]
public async Task CustomerCreated([EventGridTrigger] EventGridEvent eventGridEvent, FunctionContext functionContext)
{
// My implementation
}
System.NotSupportedException: 不支持对没有无参数构造函数、单一参数化构造函数或用 'JsonConstructorAttribute' 注释的参数化构造函数的类型进行反序列化。键入“Azure.Messaging.EventGrid.EventGridEvent”。路径:$ | 行号:0 | BytePositionInLine: 1.'
如何从 EventGrid 接收事件?
回答
这样做的新方法似乎CloudEvent来自Azure.Messaging命名空间。
(附带说明一下,数据属性是区分大小写的,我不确定以前是否是这样。)
public async Task CustomerCreated([EventGridTrigger] CloudEvent eventGridEvent, FunctionContext functionContext)
{
// [...]
}
更新:
当部署到 Azure 并从使用 Azure 函数作为端点的真实事件网格接收事件时,这会中断。但是在使用 ngrok 和 webhook 进行本地测试时效果很好。回到原点。
在对过时的示例进行无休止的谷歌搜索之后,我在本文档中找到了一条注释,指出这个示例表明您需要创建一个自定义类型(看起来就像 EventGridEvent 一样)。
经过测试,我发现这确实有效:
传递一个string而不是EventGridEvent并使用来自 的实用程序函数解析实际事件EventGridEvent。
[Function(nameof(CustomerCreated))]
public async Task CustomerCreated([EventGridTrigger] string data, FunctionContext functionContext)
{
var eventGridEvent = EventGridEvent.Parse(BinaryData.FromString(data));
// Rest of code
}
另一个相关的警告是,您不能从门户创建函数,但需要从命令行运行它,例如:
az eventgrid event-subscription create --name customer-created
--source-resource-id <event-grid-topic-resource-id>
--endpoint <azure-func-resource-id> --endpoint-type azurefunction
(资源 id:s 可以在http://resources.azure.com/找到)
你好微软;
使用这种方法在 .NET5 上运行 Azure Functions 感觉不太好。我真的希望能够通过官方库从其他 Azure 服务传递像 EventGridEvent 这样的类型化对象。
我真的认为 .NET5/dotnet-isolated 上的 EventGridEvent 应该与 Azure Functions 兼容,与以前的 .NET 版本和公共示例中的级别相同。