如何使用异步方法从 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 端的日志吗?转到 kuduhttps://<functionappname>.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 函数中的存储读取的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C# Core 中的 azure blob 存储中读取所有文件
Azure:无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)