WinSCP 无法在 Azure 应用服务上作为 WebJob 运行
Posted
技术标签:
【中文标题】WinSCP 无法在 Azure 应用服务上作为 WebJob 运行【英文标题】:WinSCP fails to run as a WebJob on Azure App Service 【发布时间】:2021-12-20 19:11:14 【问题描述】:我开发了一个 .Net 控制台应用程序,可以在 Azure 应用服务下作为 Webjob 运行。
此控制台应用正在使用 WinSCP 将文件从应用服务文件系统传输到本地 FTP 服务器。
应用服务和永久 FTP 服务器之间的连接正常。
大多数情况下,作业成功,文件被同步,日志文件也被写入。
有时,作业失败,没有同步文件,也没有写入日志。
在我们的所有 Azure 环境(开发、测试、生产)上间歇性触发的异常:
WinSCP 进程以退出代码 -1073741819 (C0000005) 终止。没有输出。未创建响应日志文件 D:\local\Temp\wscp550C.03E988EE.tmp。这可能表明缺少对日志文件夹的写入权限或启动 WinSCP 本身的问题。
有什么线索吗?
我的代码 sn-p ..
///Session Options
var sessionOptions = new SessionOptions
Protocol = Protocol.Sftp,
HostName = host,
UserName = userName,
Password = password,
SshHostKeyFingerprint = sshHostKeyFingerprint
;
///Opening Session & Sync Files
using (var session = new Session())
var timestmp = DateTime.Now.ToString("MMddyyyyHHmmss") + ".txt";
session.SessionLogPath = ConfigurationManager.AppSettings["SessionLogPath"] + timestmp;
session.XmlLogPath = ConfigurationManager.AppSettings["XmlLogPath"] + timestmp;
session.XmlLogPreserve = true;
session.FileTransferred += FileTransferred;
session.Open(sessionOptions);
var syncResult = session.SynchronizeDirectories(SynchronizationMode.Remote, localFolder, remoteFolder, false,false);
syncResult.Check();
【问题讨论】:
我们需要minimal reproducible example。 似乎是“WinSCP.exe”进程尝试写入应用服务文件系统时出现问题。我认为这是不允许的..你怎么看? 你之前写过这个问题是间歇性的,是不是? 我现在可以告诉您如何重现该问题。我已将 session.XmlLogPath 和 session.XmlLogPreserve 配置为 true。每当 session.Open(..) & session.SynchronizeDirectories(..) 成功时,就会写入日志文件。但是,每当 session.Open(..) 发生内部异常时,就会出现上述问题..“缺少写入权限” 如果 WinSCP 甚至无法启动,它显然无法写入任何日志。这无助于我们重现问题。 “缺少写权限” 只是一个提示,在这种情况下很可能是错误的。如果有时可以写入日志,则不能是由于“写入权限”。正如我在下面的回答所说,C0000005 表示“内存访问冲突”。 【参考方案1】:C0000005 表示“(内存)访问冲突”。这可能表明 WinSCP 已崩溃。这可能意味着 WinSCP 中的一个错误。确保您拥有最新版本。否则,您最好在 WinSCP support forum 上报告此问题,因为软件错误并不真正属于 Stack Overflow。
【讨论】:
【参考方案2】:WinSCP 进程以退出代码 -1073741819 (C0000005) 终止。没有输出。未创建响应日志文件 D:\local\Temp\wscp550C.03E988EE.tmp。这可能表明缺少对日志文件夹的写入权限或启动 WinSCP 本身的问题。
错误消息显示您没有在生产中授予写入权限。请在生产环境中授予所有write
权限。
WinSCP 无法创建/写入用于向.NET assembly 报告的日志文件。确保您的进程对临时文件夹具有写入权限。或者,您可以使用(未记录)propertySession.XmlLogPath
更改日志文件位置。
参考here
【讨论】:
C0000005 不是表示“(内存)访问冲突”,而不是文件系统权限问题吗? 异常间歇性发生,即大部分时间作业成功完成,有时会出现异常。 关于“写入”权限,我认为我不能在应用服务中执行此操作,因为正在复制 webjob 内容以在我无法管理的临时目录下运行。我能看到的唯一有效解决方案是控制此类临时日志的输出路径“...\wscp0DE0.0234E2B0.tmp” 广告“例外情况间歇性发生”——这是非常重要的信息,您从未在问题中提及。 我已将 Session.XmlLogPath 配置到不同的目录,但问题仍然存在以上是关于WinSCP 无法在 Azure 应用服务上作为 WebJob 运行的主要内容,如果未能解决你的问题,请参考以下文章
WinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”
Alchemy Websockets:无法在 Azure 上托管服务器