C# 使用SSH.Net下载和返回非阻塞数据流

C# 使用SSH.Net下载和返回非阻塞数据流,c#,streaming,sftp,ssh.net,C#,Streaming,Sftp,Ssh.net,我使用用于执行SFTP操作的来处理大数据文件(=500MB) 我在如何以非阻塞方式返回数据方面遇到了问题 ftpClient.DownloadFile()方法签名可以在写入文件时使用,或者如果有某种方法可以实例化流,但是当我想要返回流而不阻塞时,如何使用它存在问题 到目前为止,我看到的所有示例都是将下载内容写入Filestream。没有只返回流的内容 使用.Net的内置FTP,您只需使用response.GetResponseStream(),它就可以在不阻塞的情况下返回数据 在return语句

我使用用于执行SFTP操作的来处理大数据文件(=500MB

我在如何以非阻塞方式返回数据方面遇到了问题

ftpClient.DownloadFile()
方法签名可以在写入文件时使用,或者如果有某种方法可以实例化流,但是当我想要返回流而不阻塞时,如何使用它存在问题

到目前为止,我看到的所有示例都是将下载内容写入
Filestream
。没有只返回流的内容

使用.Net的内置FTP,您只需使用
response.GetResponseStream()
,它就可以在不阻塞的情况下返回数据

在return语句中使用它的唯一方法是写入临时文件。但这导致它成为一个阻塞操作

        var tmpFilename = "temp.dat";
        int bufferSize = 4096;
        var sourceFile = "23-04-2015.dat";

        using (var stream = System.IO.File.Create(tmpFilename , bufferSize, System.IO.FileOptions.DeleteOnClose))
        {
            sftpClient.DownloadFile(sourceFile, stream);
            return stream;
        }
我不想让它阻塞,而是要流式返回数据

我还希望避免创建临时文件

是否有另一种实现方法使其流式返回数据


或者,我可以实例化一个替代流(除了
MemoryStream
),它可以处理大文件吗

这是个老问题,但我也有类似的问题。 如果您想直接获取流,可以写入MemoryStream

SftpClient _sftpClient;
_sftpClient = new SftpClient("sftp.server.domain", "MyLoginHere", "MyPasswordHere");
Stream fileBody = new MemoryStream();
_sftpClient.DownloadFile(ftpFile.FullName, fileBody);
fileBody.Position = 0; //dont forget to set the stream position back to beginning
如果要下载文件,可以在单独的线程中或作为异步调用进行下载,然后调用委托:

_sftpClient.DownloadFile(ftpFile.FullName, fileBody, YourActionDelegateHere);

许多年后,我遇到了同样的问题,我花了比我愿意承认的时间更长的时间才弄明白。这是最热门的搜索结果之一,所以这里有一个实际的答案:原来SSH.NET确实公开了一个
SftpFileStream
,只是使用了不同的方法,如果您正在寻找“下载”,您可能看不到这些方法。使用
sftpClient.OpenRead(sourceFile)
代替
sftpClient.DownloadFile(sourceFile,stream)
。这将允许您直接处理流数据。

下载是通过哪个协议(即:HTTP、TCP)进行的?我不明白您的问题。既然TCP是一种非应用程序协议,那么它是如何进来的呢?不要认为有HTTP上的SFTP这样的东西。。。。但它是SFTP,通过端口22。我想您应该首先从SFTP下载到您的应用程序(可以是WPF或ASP.NET,即)。但是下载是直接的,对吗?这对于小文件来说可能很好,但它的性能最低,因为您没有使用缓冲。。。对于大文件,您将获得
OutOfMemoryException
s。