Azure Function解压文件本地调试正常但生产环境无输出
问题分析与解决方案
你的问题根源在于异步方法未被等待,导致函数在文件上传操作完成前就提前结束了——虽然日志显示所有步骤都执行了,但实际的Blob上传操作根本没完成,所以目标容器里看不到文件。
具体原因
你代码里调用了blockBlob.UploadFromStreamAsync(fileStream)这个异步方法,但你的Run方法是同步的void类型,没有用await等待异步操作完成。在Azure Functions的运行环境中,同步方法执行完毕后,运行时会立刻回收相关资源,没完成的异步操作直接被终止,自然看不到上传的文件。
修复步骤
- 把
Run方法的返回类型从void改成async Task - 在调用
UploadFromStreamAsync时加上await关键字,确保上传操作完成后再继续执行后续代码
修改后的完整代码
using System; using System.IO; using System.IO.Compression; using System.Threading.Tasks; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Host; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; namespace ExtractZipFunction { public static class ScompattaZip { [FunctionName("ScompattaZip")] public static async Task Run( [BlobTrigger("input-files/{name}", Connection = "connectionStorage")] Stream myBlob, string name, TraceWriter log) { log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes"); try { string destinationStorage = Environment.GetEnvironmentVariable("destinationStorage"); string destinationContainer = Environment.GetEnvironmentVariable("destinationContainer"); log.Info($"destinationStorage: {destinationStorage}"); log.Info($"destinationContainer: {destinationContainer}"); if (System.IO.Path.GetExtension(name).ToLower() == ".zip") { log.Info("It's a zip"); var archive = new ZipArchive(myBlob); var storageAccount = CloudStorageAccount.Parse(destinationStorage); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference(destinationContainer); // 可选:如果目标容器可能不存在,添加自动创建逻辑 await container.CreateIfNotExistsAsync(); foreach (var entry in archive.Entries) { var blockBlob = container.GetBlockBlobReference(entry.FullName); using (var fileStream = entry.Open()) { if (entry.Length > 0) { log.Info($"Estrazione 1 - {entry.FullName}"); await blockBlob.UploadFromStreamAsync(fileStream); log.Info($"Estrazione 2 - {entry.FullName}"); } } } } else { log.Info("Not a zip"); } } catch (Exception ex) { log.Info($"Errore: {ex.Message}"); } } } }
额外提示
- 建议加上
await container.CreateIfNotExistsAsync();,避免因为目标容器不存在导致的隐性失败 - 确认你的Azure Function拥有目标容器的写入权限(检查连接字符串或系统分配身份的权限配置)
- 确保函数运行时版本(v2及以上)支持异步方法
内容的提问来源于stack exchange,提问作者skysurfer
相关产品推荐
相关产品推荐

