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 程序集比较本地和远程文件

使用 WinSCP .NET 程序集防止通过 FTP 传输不完整的文件

使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本

WinSCP .NET 程序集无法识别 Session.PutFiles 中的 FTP 链接/URL

使用 SSH.NET 连接到 OpenSSH 7.4p1 失败并显示“服务器响应在位置包含空字符”但在 WinSCP 中有效