如何使用异步方法从 Azure 函数中的存储读取

Posted

技术标签:

【中文标题】如何使用异步方法从 Azure 函数中的存储读取【英文标题】:How do I read from storage in Azure function using asynchronous methods 【发布时间】:2019-07-02 12:24:06 【问题描述】:

我创建了一个 Azure V2 函数,我想从一个将 CSV-blob 转换为 JSON 的逻辑应用程序调用。此方法在 VS 中本地运行并从浏览器调用它时工作正常,但部署它并从 Logic App 调用它什么都不做。

它永远不会向逻辑应用返回任何内容。 Logic 应用重试多次,然后失败。

调试它显示它正在调用 DownloadTextAsync,然后在一段时间后调试器再次捕获重试,然后一次又一次。

我尝试用谷歌搜索并找到一些关于死锁的文章,虽然没有可能被阻止的 UI,并尝试将其更改为:

var content = await blob.DownloadTextAsync().ConfigureAwait(false);

我还尝试使函数同步并调用:

var content = blob.DownloadTextAsync().Result;

但没有一个工作。怎么了?

    [FunctionName("ConvertCSVToJSON")]
    public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
    
        var containerName = GetEnvironmentVariable("RawDataStorageContainerName");
        var blobName = query["Path"];
        var accountName = GetEnvironmentVariable("BlobDataStorageAccountName");
        var accessKey = GetEnvironmentVariable("BlobDataStorageAccountAccessKey");
        var connectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accessKey + ";EndpointSuffix=core.windows.net";
        var storage = CloudStorageAccount.Parse(connectionString);
        var client = storage.CreateCloudBlobClient();
        var container = client.GetContainerReference(containerName);
        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

        var content = await blob.DownloadTextAsync();
        var json = ConvertCsvToJsonObject(content);

        return (ActionResult)new OkObjectResult($"json");
    

编辑: 我还尝试添加此代码: CloudBlockBlob jsonBlob = container.GetBlockBlobReference(blobName.Replace("csv","json")); 等待 jsonBlob.UploadTextAsync(内容);

在本地运行它会创建一个新的 blob,但从逻辑应用程序运行它不会,因此由于某种原因,如果从逻辑应用程序调用读取调用永远不会返回到函数

【问题讨论】:

你检查过 Azure Function 端的日志吗?转到 kudu https://&lt;functionappname&gt;.scm.azurewebsites.net/DebugConsole 并导航到 D:\home\LogFiles\Application\Functions\Host 以查看功能主机日志。 感谢您的提示,但不幸的是它什么也没显示。昨天有一些行: 2019-02-07T13:41:25.543 [错误] Executed 'ConvertCSVToJSON' (Failed, Id=98a10c60-6be8-4b8f-a77a-0c37f1ab837e) 指定的资源名称包含无效字符。但是那些试图用错误的参数调用它的人。今天没有日志。 浏览器中是否直接调用了Azure函数? 是的,从 VS 启动函数并从浏览器调用它可以正常工作。远程调试和步进显示执行进入异步调用,但它永远不会从那里返回。所以代码是正确的,但是异步的东西现在导致了问题。 嗯...我可以确认您的代码在我的逻辑应用测试中有效。您的存储帐户中是否有任何防火墙设置?还有你如何调用函数,使用内置的 Azure 函数操作? 【参考方案1】:

问题不在于代码,而在于拼写错误的设置值。

【讨论】:

以上是关于如何使用异步方法从 Azure 函数中的存储读取的主要内容,如果未能解决你的问题,请参考以下文章

如何读取存储在 Azure 密钥保管库中的值/秘密

如何从 C# Core 中的 azure blob 存储中读取所有文件

如何从 C# 中的 Azure 函数在设备中执行方法?

Azure:无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)

使用 C# 从存储在 azure blob 存储中的 200gb 文本文件中读取一行

使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件