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 可执行文件”

winscp无法连接虚拟机linux

winscp无法连接虚拟机linux,是怎么回事?

Alchemy Websockets:无法在 Azure 上托管服务器

无法将azure注册表中的docker镜像托管到azure批处理

BizTalk 2016 sFTP WinSCP - 无法接收更多消息