英文:
Blob trigger using event grid in .NET Isolated Worker functions
问题
以下是您提供的代码的翻译部分:
我有一个来自Microsoft.Azure.WebJobs的BlobTrigger(.NET内部处理函数)。
原因是当使用BlobTriggerSource.LogsAndContainerScan时存在延迟。微软确实说它可能需要最多10分钟才能触发触发器,但那是完全不准确的。有时候它需要长达一小时,所以我设置了一个事件网格并更改了数据源。
现在我想将此触发器迁移到.NET 7隔离的工作器函数,但在微软的文档中找不到任何信息。
我尝试使用来自Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs的BlobTrigger,但它没有Source属性,因此以下代码不起作用。
请注意,代码中的HTML编码(如")已经被翻译成了相应的引号字符。如果您需要进一步的帮助或翻译其他部分,请随时提问。
英文:
I have this BlobTrigger that comes from Microsoft.Azure.WebJobs (.NET in-process functions).
public class SftpFileUploadTrigger
{
    private readonly IDtoBuilderManager _dtoBuilderManager;
    public SftpFileUploadTrigger(IDtoBuilderManager dtoBuilderManager)
    {
        _dtoBuilderManager = dtoBuilderManager;
    }
    [FunctionName(nameof(SftpFileUploadTrigger))]
    public async Task Run(
        [BlobTrigger("%BlobStorageContainers:AzureSftp%/{name}", Source = BlobTriggerSource.EventGrid, Connection = "Storage:ConnectionString")] Stream dataFileBlob,
        string name,
        [DurableClient] IDurableOrchestrationClient orchestrationClient,
        ILogger log)
    {
        log.LogInformation("{FunctionName} function processed blob with name {Name} and size {Length} Bytes", nameof(SftpFileUploadTrigger), name, dataFileBlob.Length);
        // Create data transfer object
        var dataFileCreateDto = _dtoBuilderManager.DataFileCreateDtoBuilder
            .WithName(name)
            .AddSession()
            .WithStatus(DataFileStatus.Pending)
            .WithSessionType(DataFileSessionType.DataFileIntake)
            .WithStartedOn(DateTime.UtcNow)
            .Build();
        // Start data file intake workflow
        string instanceId = await orchestrationClient.StartNewAsync(nameof(DataFileIntakeOrchestration), dataFileCreateDto);
        log.LogInformation("Started {OrchestrationName} with id {InstanceId}", nameof(DataFileIntakeOrchestration), instanceId);
    }
}
The reason why I used BlobTriggerSource.EventGrid is because of the delays when using BlobTriggerSource.LogsAndContainerScan. Microsoft does say that it can take up to 10 minutes for the trigger to fire but that is a total lie. Sometimes it took up to an hour so I just setup an event grid and changed the source.
Now I want to migrate this trigger to .NET 7 Isolated Worker functions and I can't seem to find anything in Microsoft's documentation.
I have tried using the BlobTrigger from Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs but it does not have a Source property so the below code does not work.
public class SftpFileUploadTrigger
{
    private readonly ILogger<SftpFileUploadTrigger> _logger;
    public SftpFileUploadTrigger(ILogger<SftpFileUploadTrigger> logger)
    {
        this._logger = logger;
    }
    [Function(nameof(SftpFileUploadTrigger))]
    public async Task Run(
        [BlobTrigger("%BlobStorageContainers:AzureSftp%/{name}", Source = BlobTriggerSource.EventGrid, Connection = "Storage:ConnectionString")] Stream dataFileBlob,
        string name,
        [DurableClient] DurableTaskClient client)
    {
        this._logger.LogInformation("{FunctionName} function processed blob with name {Name} and size {Length} Bytes", nameof(SftpFileUploadTrigger), name, dataFileBlob.Length);
    }
}
答案1
得分: 1
是的,Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs 包不具有 Source 属性,因为 Source 是 Microsoft.Azure.WebJobs 包的一部分,而隔离函数不使用 Microsoft.Azure.WebJobs 。
我使用了以下步骤来以另一种方式实现相同的功能-
代码:
using System;
using System.IO;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace Company.Function
{
    public class BlobTriggerEventGrid
    {
        private readonly ILogger _logger;
        public BlobTriggerEventGrid(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<BlobTriggerEventGrid>();
        }
        [Function("BlobTriggerEventGrid")]
        public void Run([BlobTrigger("samples-workitems/{name}", Connection = "afreensa01_STORAGE")] string myBlob, string name)
        {
            _logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {myBlob}");
        }
    }
}
使用 cmd 命令运行 ngrok.exe http http://localhost:7071 并复制 https://xxxxxxxx.ngrok.io
根据 ms 文档,你的事件驱动的 blob 存储触发器应该看起来像 http://localhost:7071/runtime/webhooks/blobs?functionName={your function name}。
将 http://localhost:7071 替换为 https://xxxxxxxx.ngrok.io,最终的终端点将看起来像 http://xxxxxxxx.ngrok.io/runtime/webhooks/blobs?functionName={your function name}。
在创建事件之前,请确保你的函数在本地运行,并且 ngrok 也在线。
使用以下 http://xxxxxxxx.ngrok.io/runtime/webhooks/blobs?functionName={your function name} 终端点并单击创建。
一旦事件创建完成,你可以上传一个 blob 来测试是否正常工作。
输出:
我为 Microsoft.Azure.Functions.Worker.Extensions 包的不具备 source 参数支持问题创建了一个 github 问题,你可以参考它以获取最新的更新。
英文:
> I have tried using the BlobTrigger fromMicrosoft.Azure.Functions.Worker.Extensions.Storage.Blobs but it does not have a Source property
Yes, Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs package doesn't have a Source property as Source is a part of Microsoft.Azure.WebJobs package and isolated function doesn't use Microsoft.Azure.WebJobs .
I have used an alternative way to achieve the same by following below steps-
code:
using  System;
using  System.IO;
using  Microsoft.Azure.Functions.Worker;
using  Microsoft.Extensions.Logging;
namespace  Company.Function
{
public  class  BlobTriggerEventGrid
{
private  readonly  ILogger  _logger;
public  BlobTriggerEventGrid(ILoggerFactory  loggerFactory)
{
_logger  =  loggerFactory.CreateLogger<BlobTriggerEventGrid>();
}
[Function("BlobTriggerEventGrid")]
public  void  Run([BlobTrigger("samples-workitems/{name}",Connection  =  "afreensa01_STORAGE")] string  myBlob, string  name)
{
_logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name}  \n Data: {myBlob}");
}
}
}
Run ngrok using ngrok.exe http http://localhost:7071 command in cmd and copy https://xxxxxxxx.ngrok.io

As per ms docs, your event-driven blob storage trigger should look like http://localhost:7071/runtime/webhooks/blobs?functionName={your function name}.
Replace http://localhost:7071 with https://xxxxxxxx.ngrok.io and your final endpoint would look like http://xxxxxxxx.ngrok.io/runtime/webhooks/blobs?functionName={your function name}.
Make sure before creating event, your function is running locally and ngrok is online too.


Use http://xxxxxxxx.ngrok.io/runtime/webhooks/blobs?functionName={your function name} endpoint below and click create.

Once the event is created then you can upload a blob to test if its working.
Output:



I have opened a github issue for Microsoft.Azure.Functions.Worker.Extensions package not having source parameter support. You can refer it for any latest update.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论