【问题标题】:Error on writer.close() of GetRequestStream of FtpWebRequest in VB.NETVB.NET 中 FtpWebRequest 的 GetRequestStream 的 writer.close() 错误
【发布时间】:2023-07-23 20:07:02
【问题描述】:

所以我有一个简单的 ftp 传输函数,它在缓冲区上工作,将大块文件发送到我的服务器。我尝试上传一个 300MB 的文件,绝对没有问题,但是在函数完成发送 1.5GB 文件的每个字节后,函数在 writer.close() 上崩溃。

然后我收到以下错误: “底层连接已关闭:接收时发生意外错误。”

Public Function upload(ByRef fullpath As String, ByRef filename As String) As Boolean
    If filename <> "" Then
        Try
            Dim clsRequest As FtpWebRequest = DirectCast(WebRequest.Create("ftp://myserver" & filename), FtpWebRequest)
            clsRequest.Credentials = New NetworkCredential(user, password)
            clsRequest.Method = WebRequestMethods.Ftp.UploadFile
            clsRequest.KeepAlive = True
            clsRequest.Timeout = -1
            clsRequest.UsePassive = True


            Dim FileInfo As FileInfo = New FileInfo(fullpath)
            Dim bfile() As Byte = New Byte((FileInfo.Length) - 1) {}
            clsRequest.ContentLength = FileInfo.Length


            Dim bytesRead As Integer
            Dim buffer(4096) As Byte
            Using reader As FileStream = FileInfo.OpenRead
                Using writer As Stream = clsRequest.GetRequestStream
                    Do
                        bytesRead = reader.Read(buffer, 0, buffer.Length)
                        If bytesRead > 0 Then
                            writer.Write(buffer, 0, bytesRead)
                        End If
                    Loop While bytesRead > 0
                    writer.Flush()
                    ''crashes here >>>>>>>
                    writer.Close()
                End Using
                reader.Flush()
                reader.Close()

            End Using

            Return True


        Catch ex As Exception
            Return False
        End Try

    End If


End Function

编辑:

所以我找到了一个“解决方案”,它包括在传输所有字节后对连接执行 .abort() 。它工作得很好,我没有看到任何缺点,但后来我发现这样做有点草率。有没有真正的解决方案?

【问题讨论】:

    标签: vb.net streamwriter ftpwebrequest


    【解决方案1】:

    来自here

    当服务器或其他网络设备意外关闭现有的传输控制协议 (TCP) 连接时,会出现此问题。当服务器或网络设备上的超时值设置得太低时,可能会出现此问题。 ...如果服务器意外重置连接,例如如果未处理的异常使服务器进程崩溃,也会出现此问题。分析服务器日志,看看这是否是问题所在。

    提出了多种解决方案。

    另外,Using 块正在处理 writer 的关闭/处置(以及 reader 的另一个),因此您不需要手动处置它,这就是 .Close 正在做的事情.

    来自Stream.Close Method

    该方法调用Dispose,指定true释放所有资源。您不必专门调用 Close 方法。相反,请确保正确处置每个 Stream 对象。您可以在 using 块(或 Visual Basic 中的 Using 块)中声明 Stream 对象,以确保释放流及其所有资源,也可以显式调用 Dispose 方法。

    【讨论】:

    • 关于使用处理的好点,但它现在崩溃了。 :S 不幸的是,我无法控制服务器,因为它是共享主机。