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
相关产品推荐
相关产品推荐

