我已按照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,
答案 0 :(得分:3)
本教程适用于v1 c# script function,因为您在谈论功能代码时会提到csx file。但是现在项目链接指向v2预编译的代码,当我们严格按照教程进行操作时,对代码的更改可能会导致问题。
让我们通过两个步骤来解决不一致问题。
关键是功能未连接到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)
在同一步骤中,教程为在part1的Blob存储帐户中创建的容器myContainerName
设置了应用设置thumbnails
。
但是在我们的代码中,我们可以看到它通过AzureWebJobsStorage
连接到Storage account created for Function app,并希望从应用设置THUMBNAIL_CONTAINER_NAME
中获得容器名称。
快速解决方案是替换AzureWebJobsStorage
和THUMBNAIL_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);
}
参数的情况下使其工作存储帐户的权限。