none
FtpWebRequest で 基になる接続が閉じられました: サーバーによってプロトコル違反が発生しました エラーが出る RRS feed

  • 質問

  • お世話になります。VB2005にてFTPを使ったファイルを転送アプリを作成しています。

    300MBほどあるファイルを転送すると、「基になる接続が閉じられました: サーバーによってプロトコル違反が発生しました」
    とエラーになります。 毎回そうなるわけではなく、たまに発生します。
    エラーが発生したとしても、ファイルは常に正常に最後のバイトまで転送されており、myAboutBox への表示も「転送完了」となります。でも戻り値が False となり、エラーが記録されます。


    どういう理由で、エラーが発生しているのか。またどうすれば回避できるのかがわかりません。
    アドバイスをよろしくお願いいたします。

    なお、FTPサーバーは Windows 2003 RS IIS で稼動しています。
    クライアントは、Windows XP Pro


    Code Snippet

       Public Function UpLoadFile(ByVal upFile As String, _
                                    ByVal strFTPUrl As String) As Boolean

            Dim myAboutBox As New AboutBox1

            Try

                myAboutBox.LaFileName.Text = upFile
                myAboutBox.Show()
                myAboutBox.Refresh()

                'FtpWebRequestの作成
                Dim ftpReq As System.Net.FtpWebRequest = FtpWebRequest.Create(strFTPUrl)

                ftpReq.Credentials = Me.ftpCredential
                ftpReq.Method = WebRequestMethods.Ftp.UploadFile
                ftpReq.KeepAlive = True
                ftpReq.UseBinary = True


                'PASVモードを無効にする
                ftpReq.UsePassive = False

                'ファイルをアップロードするためのStreamを取得
                'この時点で通信開始される
                Using reqStrm As System.IO.Stream = ftpReq.GetRequestStream()

                    'アップロードするファイルを開く
                    Using fs As New System.IO.FileStream(upFile, _
                                                        System.IO.FileMode.Open, _
                                                        System.IO.FileAccess.Read)
                        'アップロードStreamに書き込む
                        Dim buffer(2047) As Byte
                        Dim i As Integer
                        Dim readSize As Integer

                        Do

                            readSize = fs.Read(buffer, 0, buffer.Length)

                            reqStrm.Write(buffer, 0, readSize)

                            i = i + 1
                            If i > 500 Then
                                myAboutBox.LaStatus.Text = Format((fs.Position / 1024000), "#,##0.00") & " / " & Format((fs.Length / 1024000), "#,##0.00") & "MB (" & Format((fs.Position / fs.Length * 100), "0.00") & "%)"
                                myAboutBox.Refresh()
                                Application.DoEvents()
                                i = 0
                            End If

                        Loop While readSize <> 0

                    End Using



                End Using

                'FtpWebResponseを取得()
                Using ftpRes As FtpWebResponse = ftpReq.GetResponse()
                    'FTPサーバーから送信されたステータスを表示
                    myAboutBox.Label2.Text = ftpRes.StatusCode & "," & ftpRes.StatusDescription
                    Application.DoEvents()
                End Using

                myAboutBox.LaStatus.Text = "転送完了"
                Application.DoEvents()
                myAboutBox.Close()
                myAboutBox = Nothing

                UpLoadFile = True

            Catch e As WebException

                EventLog.WriteEntry("FJFTP", "UpLoadFileError:" & Err.Description & " WebException:" & e.Message, EventLogEntryType.Warning, Err.Number)
                UpLoadFile = False
                myAboutBox.Close()
                myAboutBox = Nothing

            End Try

        End Function


    2008年2月16日 7:17

回答

すべての返信

  • とりあえず、すべてのApplication.DoEventsを殺してみられてはいかがでしょう。

    2008年2月22日 13:34
  • 返信ありがとうございます。

    Application.DoEvents() をとめても変化ありませんでした。

    とりあえず今は、エラーが発生した場合ログの記録と転送を再び行なうように組み込んで対応しています。

    実運用していくと、発生頻度がほとんどないことがわかってきました。(テストの段階では多かったのですが・・・)
    回線の状態にもよるのかもしれません。

    2008年2月27日 23:58
  • こんにちは。中川俊輔 です。

     

    はなはなはなさん、回答ありがとうございます。

     

    TKSOFTさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、はなはなはなさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、是非投稿して下さい!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    TKSOFTさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月21日 9:06