【问题标题】:WinSCP .NET assembly fails with "The winscp.exe executable was not found" in Session.Open in C# Azure functionWinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”
【发布时间】: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# 代码中,当我尝试打开会话时它失败了。

【问题讨论】:

    标签: c# azure-functions sftp winscp winscp-net


    【解决方案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 的路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 2022-06-28
      • 2018-06-08
      • 2016-02-06
      • 1970-01-01
      • 2021-04-16
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多