关闭上传流的FtpWebRequest会挂起大文件

MT.*_*MT. 7 .net c#

我正在尝试使用FtpWebRequest上传一些文件.这适用于小文件(比如<2MB),但是当我尝试加载16MB文件时,文件上传成功,但是当我调用request.GetRequestStream().关闭时,代码挂起(如果超时低则超时)足够).

我可能只是a)没有关闭它和b)没有费心从服务器得到响应,但这似乎不对!请参阅下面的代码(使用SSL与否,出现同样的问题.)

output.Close()是挂起的行....

    public static void SendFileViaFtp(string file, string url, bool useSsl, ICredentials credentials)
    {

        var request = (FtpWebRequest)WebRequest.Create(url + Path.GetFileName(file));
        request.EnableSsl = useSsl;
        request.UseBinary = true;
        request.Credentials = credentials;

        request.Method = WebRequestMethods.Ftp.UploadFile;

        request.Timeout = 10000000;
        request.ReadWriteTimeout = 10000000;
        request.KeepAlive = true;

        var input = File.Open(file, FileMode.Open);
        var output = request.GetRequestStream();

        var buffer = new byte[1024];
        var lastBytesRead = -1;
        var i = 0;
        while (lastBytesRead != 0)
        {
            i++;
            lastBytesRead = input.Read(buffer, 0, 1024);
            Debug.WriteLine(lastBytesRead + " " + i);
            if (lastBytesRead > 0)
            {
                output.Write(buffer, 0, lastBytesRead);
            }else
            {
                Debug.WriteLine("Finished");
            }
        }
        input.Close();
        output.Close();

        var response = (FtpWebResponse)request.GetResponse();
        response.Close();
    }
Run Code Online (Sandbox Code Playgroud)

谢谢,

Fir*_*iro 5

尝试

// after finished uploading
request.Abort();   // <=== MAGIC PART
// befor response.Close()

var response = (FtpWebResponse)request.GetResponse();
response.Close();
Run Code Online (Sandbox Code Playgroud)

取自这里


Wow*_*owa 0

尝试在输入之前关闭输出。

确保最后一个缓冲区不太大,否则您可能会写入一些空字节。我不知道是否有必要,但我总是将请求内容长度设置为输入文件长度。

这是一个很好的例子:http://dotnet-snippets.de/dns/ftp-file-upload-mit-buffer-SID886.aspx