首页 > 解决方案 > 如何使用异步方法从 Azure 函数中的存储读取

问题描述

我已经创建了一个 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,但从逻辑应用程序运行它不会,因此由于某种原因,如果从逻辑应用程序调用读取调用永远不会返回到函数

标签: azureasync-awaitazure-functions

解决方案


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


推荐阅读