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

File.WriteAllBytes生产环境无报错但无法生成文件问题求助

Base64转PDF本地正常,生产环境写入后无日志且文件未生成

我通过Base64字符串生成PDF文件,本地调试完全正常,但部署到生产服务器后无法生成文件。查看日志发现,代码执行到Generating file in path后直接进入finally块,File Generated path的日志从未输出,也没有任何错误日志打印出来。我怀疑是目标文件夹没有写入权限,但不确定为什么没触发异常。

相关代码如下:

internal static void CopyFileToDir(string document, string userRelId, string name)
{
    Log.Info(Log.LOG_HANDLER, "Starting function CopyFileToDir");
    try
    {
        var fileName = userRelId + ".pdf";
        var path = @"\\MyDisc\MyFolder\" + fileName;
        var yourBase64String = document;

        Log.Info(Log.LOG_HANDLER, string.Format("CopyFileToDir v2 {0} {1}", userRelId, path));

        Log.Info(Log.LOG_HANDLER, "Getting bytes from base64");
        var fileBytes = Convert.FromBase64String(yourBase64String);

        Log.Info(Log.LOG_HANDLER, "Generating file in path");
        System.IO.File.WriteAllBytes(path, fileBytes);
        Log.Info(Log.LOG_HANDLER, "File Generated path");
    }
    catch(ArgumentException ae)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", ae);
    }
    catch (DirectoryNotFoundException dnfe)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", dnfe);
    }
    catch (IOException ioe)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", ioe);
    }
    catch (UnauthorizedAccessException uae)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", uae);
    }
    catch (NotSupportedException nse)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", nse);
    }
    catch (Exception ex)
    {
        Log.Error("DatosPersonalesHandler", "Error CopyFileToDir: ", ex);
    }
    finally
    {
        Log.Info(Log.LOG_HANDLER, "End function CopyFileToDir");
    }
}

可能的原因及解决办法

1. 先确认文件是否实际生成

日志未输出不代表代码没执行,可能是日志组件本身出了问题:

  • 直接登录生产服务器,检查\\MyDisc\MyFolder\目录下是否存在目标PDF文件;
  • 临时修改代码,在File.WriteAllBytes之后添加本地文本日志(比如写入C盘某个可访问的目录),验证代码是否走到这一步。

2. 网络共享目录权限排查

生产环境访问\\MyDisc\MyFolder\这类共享目录,权限逻辑和本地不同:

  • 如果是IIS部署,检查应用程序池的运行身份(比如ApplicationPoolIdentity、Network Service)是否拥有该共享目录的写入权限;
  • 如果是Windows服务,确认服务运行的账户是否能访问该共享路径;
  • 临时给共享目录开放Everyone的写入权限做测试(测试后务必收回),快速验证是否是权限问题。

3. 处理网络共享写入阻塞问题

网络存储可能存在延迟或连接不稳定,导致File.WriteAllBytes长时间阻塞甚至进程被终止:

  • 替换为带超时的异步写入,避免无限等待:
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, useAsync: true))
{
    await fs.WriteAsync(fileBytes, 0, fileBytes.Length).WaitAsync(TimeSpan.FromSeconds(30));
}
  • 同步写入时拆分步骤,每一步加日志,定位具体阻塞环节。

4. 验证异常日志是否真的能输出

有可能异常被捕获了,但日志组件没正确写入:

  • 在catch (Exception ex)中添加Console.WriteLine(ex.ToString())(如果生产环境能查看控制台输出);
  • 检查日志文件的存储路径和权限,确保日志组件自身能正常写入日志。

内容的提问来源于stack exchange,提问作者Mathias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:57:04