You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function解压文件本地调试正常但生产环境无输出

问题分析与解决方案

你的问题根源在于异步方法未被等待,导致函数在文件上传操作完成前就提前结束了——虽然日志显示所有步骤都执行了,但实际的Blob上传操作根本没完成,所以目标容器里看不到文件。

具体原因

你代码里调用了blockBlob.UploadFromStreamAsync(fileStream)这个异步方法,但你的Run方法是同步的void类型,没有用await等待异步操作完成。在Azure Functions的运行环境中,同步方法执行完毕后,运行时会立刻回收相关资源,没完成的异步操作直接被终止,自然看不到上传的文件。

修复步骤

  1. 把Run方法的返回类型从void改成async Task
  2. 在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:09:30