由Blob存储上的EventGrid触发的Azure函数

时间:2018-11-15 05:40:23

标签: c# azure azure-functions azure-blob-storage azure-eventgrid

我已按照Microsoft tutorial处理基于Azure存储中创建的Blob的事件。

事件正在触发,但是由于EventGrid事件未填充输入流参数,所以绕过了处理图像的事件代码。这应该通过Blob(图像文件)的路径进行处理。

 public static async Task Run(
        [EventGridTrigger]EventGridEvent eventGridEvent,
        [Blob("{data.url}", FileAccess.Read)] Stream input,
        ILogger log)
    {
        try
        {
            log.LogInformation("Entered Thumbnail Function ..");

            if (input != null) 
            { //doesn't get to here ..

事件每次触发的日志是

2018-11-15T05:33:41.096 [Information] Executing 'Thumbnail' (Reason='EventGrid trigger fired at 2018-11-15T05:33:41.0781270+00:00' ..

2018-11-15T05:33:41.096 [Information] Entered Thumbnail Function

2018-11-15T05:33:41.096 [Information] Executed 'Thumbnail' (Succeeded, 

2018-11-15T05:33:41.096 [Information] Executing 'Thumbnail' (Reason='EventGrid trigger fired at 2018-11-15T05:33:41.0781270+00:00', 

2018-11-15T05:33:41.096 [Information] Entered Thumbnail Function

2018-11-15T05:33:41.096 [Information] Executed 'Thumbnail' (Succeeded,

3 个答案:

答案 0 :(得分:3)

本教程适用于v1 c# script function,因为您在谈论功能代码时会提到csx file。但是现在项目链接指向v2预编译的代码,当我们严格按照教程进行操作时,对代码的更改可能会导致问题。

让我们通过两个步骤来解决不一致问题。

  1. 关键是功能未连接到part1中创建的blob存储帐户,因此输入流为空。

    由于我们已经在this step中创建了一个应用设置myblobstorage_STORAGE,因此我们只需要在功能代码中添加它即可。

    public static async Task Run(
        [EventGridTrigger]EventGridEvent eventGridEvent,
        [Blob("{data.url}", FileAccess.Read, Connection = "myblobstorage_STORAGE")] Stream input,
        ILogger log)
    
  2. 在同一步骤中,教程为在part1的Blob存储帐户中创建的容器myContainerName设置了应用设置thumbnails

    但是在我们的代码中,我们可以看到它通过AzureWebJobsStorage连接到Storage account created for Function app,并希望从应用设置THUMBNAIL_CONTAINER_NAME中获得容器名称。

    快速解决方案是替换AzureWebJobsStorageTHUMBNAIL_CONTAINER_NAME,并为thumbnailWidth设置一个常量。

    private static readonly string BLOB_STORAGE_CONNECTION_STRING = Environment.GetEnvironmentVariable("myblobstorage_STORAGE");
    ...
    var thumbnailWidth = 100;
    var thumbContainerName = Environment.GetEnvironmentVariable("myContainerName");
    

    您当然可以选择在Azure门户的应用程序设置中添加THUMBNAIL_WIDTH

重新发布,一切正常。

答案 1 :(得分:0)

数据将永远不会传递。事件网格事件将仅传递元数据,其中将包含可用于检索内容的Blob URI。

答案 2 :(得分:0)

除了当前接受的答案 (https://stackoverflow.com/a/53314953/816663) 之外,如果您的 Function 应用程序具有具有适当 Blob 的系统或用户分配的身份,您还可以在不添加 function waitUntilElementLoad(selector, delay) { if(document.querySelector(selector) != null){ // element found; do something } else setTimeout(()=>waitUntilElementLoad(selector, delay), delay); } 参数的情况下使其工作存储帐户的权限。