WinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”
Posted
技术标签:
【中文标题】WinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”【英文标题】:WinSCP .NET assembly fails with "The winscp.exe executable was not found" in Session.Open in C# Azure function 【发布时间】:2021-11-21 18:59:05 【问题描述】:首先我生成了一个简单的控制台应用程序,以查看 WinSCP 生成的是否正常工作 - 就是这种情况
现在我尝试使用 WinSCP 编写一个 Azure 函数 - 以相同的方式 - 相同的参数 - 我在 Session.Open
(SessionLocalException) 上遇到异常:
[错误] 执行“WriteFile”(失败,Id=68e2ef30-c2fb-4f5e-8444-93634a2728bb,持续时间=256ms) 在 WinSCPnet 程序集 (D:\home\site\wwwroot\bin) 和条目程序集 Microsoft.Azure.WebJobs.Script.WebHost (D:\Program Files (x86)\ SiteExtensions\Functions\3.2.0\32bit),也不在安装路径中。您可以使用 Session.ExecutablePath 属性显式设置 winscp.exe 的路径。
winscp.exe
文件不在D:\home\site\wwwroot\bin
中,而是在D:\home\site\wwwroot
中。由于我通过 Visual Studio 发布它是只读的,所以我不能只将文件复制到正确的位置。
如何更新我的 zip 部署以使文件位于正确的位置?
我的代码:
public static async Task<IActionResult> WriteFile(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req)
SessionOptions sessionOptions = new SessionOptions
Protocol = Protocol.Sftp,
HostName = "xxx",
UserName = "xxx",
Password = "xxx",
SshHostKeyFingerprint = "xxx",
;
using (Session session = new Session())
try
session.Open(sessionOptions);
catch (SessionLocalException)
content = JsonConvert.SerializeObject(new success = false, exception = "SessionLocalException", condition = "Error communicating with winscp.com. See the exception documentation for details." );
return (ActionResult)new OkObjectResult($"content");
有关详细信息的异常文档没有多大帮助 有人可以帮帮我吗?
我第一次直接在 Azure 门户中编写了一些函数来处理 SFTP 相关活动 - 我是 Azure Functions 的新手,但我找到了处理它的方法
现在我尝试在 Visual Studio 2019 中编写这些函数以发布到 Azure 函数
问题是,在 C# 代码中,当我尝试打开会话时它失败了。
【问题讨论】:
【参考方案1】:这个确切的问题记录在WinSCP guide to transfers in Microsoft Azure Function:
您将面临的唯一问题是,由于某种原因,将项目发布到 Azure 存储时,
winscp.exe
依赖项存储到函数的根文件夹,而不是bin
子文件夹以及其他二进制文件(尤其是WinSCPnet.dll
)。要克服这个问题,您需要使用
Session.ExecutablePath
指向winscp.exe
的实际位置。您可以使用ExecutionContext.FunctionAppDirectory
来引用函数的根文件夹。要获取ExecutionContext
的实例,请将新参数添加到您的入口方法的签名中(通常是Run
)。[FunctionName("Function1")] public static void Run( [TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context) // ... session.ExecutablePath = Path.Combine(context.FunctionAppDirectory, "winscp.exe");
(完整代码见指南)
毕竟,异常消息提示相同:
您可以使用 Session.ExecutablePath 属性显式设置 winscp.exe 的路径。
【讨论】:
以上是关于WinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用密码或 SSH 指纹进行 SFTP 身份验证 WinSCP C# .NET 程序集
使用 WinSCP .NET 程序集防止通过 FTP 传输不完整的文件
使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本
WinSCP .NET 程序集无法识别 Session.PutFiles 中的 FTP 链接/URL
使用 SSH.NET 连接到 OpenSSH 7.4p1 失败并显示“服务器响应在位置包含空字符”但在 WinSCP 中有效