Azure Function部署后无法读取JSON文件但本地运行正常的问题求助
看起来你遇到了Azure Function部署后文件路径不兼容的典型问题,我来帮你分析原因并给出具体解决办法:
首先明确核心矛盾:本地开发环境和Azure云端的运行目录结构完全不同,你用Directory.GetCurrentDirectory()获取的路径在云端并不对应实际的文件位置。
你的关键代码片段:
public async Task<FilePathResponse> GetFileData() { try { // Get the current working directory string currentDirectory = Directory.GetCurrentDirectory(); // Construct the path to the configuration folder and file string configFolder = "Configuration"; // Adjust as needed string configFileName = "NCPMobile_BundleConfig.json"; // Adjust as needed string filePath = Path.Combine(currentDirectory, configFolder, configFileName); if (!File.Exists(filePath)) { throw new FileNotFoundException($"Configuration file not found at: {filePath}"); } // ... 后续JSON读取逻辑 } catch (Exception ex) { throw new ApplicationException("Error occurred while retrieving bundle configuration.", ex); } }
分步解决办法:
第一步:确保文件被打包进部署包
右键你的NCPMobile_BundleConfig.json文件,选择「属性」,把「复制到输出目录」设置为如果较新则复制或者始终复制。这样发布时文件才会被包含到部署包中,而不是只留在本地项目目录里。第二步:改用云端兼容的路径获取方式
Azure Function云端的代码部署目录是site/wwwroot,这个目录可以通过环境变量HOME拼接得到,修改路径代码如下:// 替换原来的currentDirectory获取逻辑 string homeDir = Environment.GetEnvironmentVariable("HOME"); string filePath = Path.Combine(homeDir, "site", "wwwroot", configFolder, configFileName);第三步:验证云端文件是否存在
可以通过Azure门户进入你的Function App,打开「高级工具」→「Kudu」→「调试控制台」→「文件管理器」,查看site/wwwroot下是否有Configuration文件夹和对应的JSON文件。如果没有,说明部署时文件被遗漏了,需要检查发布配置(比如VS发布时是否勾选了包含所有必要文件,或者CI/CD管道的文件包含规则)。额外优化:本地和云端兼容的路径逻辑
为了让代码在两种环境都能正常运行,可以加个环境判断:string basePath; if (Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT") == "Development") { // 本地开发环境回退到项目根目录(根据你的实际结构调整层级) basePath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "..", "..", "..")); } else { // 云端环境用标准部署目录 basePath = Path.Combine(Environment.GetEnvironmentVariable("HOME"), "site", "wwwroot"); } string filePath = Path.Combine(basePath, configFolder, configFileName);
为什么本地正常但云端不行?
本地运行时,Directory.GetCurrentDirectory()返回的是项目的bin目录(比如bin/Debug/net6.0),而你的Configuration文件夹在项目根目录,本地调试时通过相对层级能找到文件;但部署到云端后,GetCurrentDirectory()返回的是云端临时工作目录,而文件实际部署在site/wwwroot下,路径完全不匹配,自然找不到文件。
内容来源于stack exchange

