- PR -

WebRequestの不安定

1
投稿者投稿内容
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-08-06 10:38
お世話になっています。

VB2005にてFTPアップロード処理を行っているのですが、
引用:
リモート サーバーがエラーを返しました: (500) 構文エラーです。コマンドが認識できません


のエラーが毎回ではなく"たまに"発生してしまい、動作が安定しません。
しかもこのエラーは.netframework2.0にSP1を当てる前は発生しないのにSP1を当てると発生するようになるみたいです。
色々調べてみたのですが詳しい情報や解決策が見つからなかったので書き込ませていただきました。

コードを載せます。
ちなみにUsingでやるパターンとUsingでやらないパターンで試してみましたが、Usingでやらないパターンの方が若干発生確率が低いです。

★Usingでやるパターン
コード:
    Private Function UploadFile(ByVal url As String, ByVal user As String, ByVal pass As String, ByVal path As String) As Boolean
        Dim req As WebRequest = Nothing
        Dim buf(1024) As Byte
        Dim size As Integer = 0

        Try
            If File.Exists(path) Then
                req = WebRequest.Create(url)
                req.Credentials = New NetworkCredential(user, pass)
                req.Method = WebRequestMethods.Ftp.UploadFile
                req.Proxy = WebRequest.DefaultWebProxy

                Using st As Stream = req.GetRequestStream()
                    Using fs As New FileStream(path, FileMode.Open)
                        Do
                            size = fs.Read(buf, 0, buf.Length)
                            st.Write(buf, 0, size)
                        Loop While size <> 0
                    End Using
                End Using

                File.Delete(path)
            End If

        Catch ex As Exception
            Return False

        Finally
            req = Nothing

        End Try

        Return True

    End Function



★Usingでやらないパターン
コード:
    Private Function UploadFile(ByVal url As String, ByVal user As String, ByVal pass As String, ByVal path As String) As Boolean
        Dim req As WebRequest = Nothing
        Dim st As Stream = Nothing
        Dim fs As FileStream = Nothing
        Dim buf(1024) As Byte
        Dim size As Integer = 0

        Try
            If File.Exists(path) Then
                req = WebRequest.Create(url)
                req.Credentials = New NetworkCredential(user, pass)
                req.Method = WebRequestMethods.Ftp.UploadFile
                req.Proxy = WebRequest.DefaultWebProxy

                st = req.GetRequestStream()
                fs = New FileStream(path, FileMode.Open)
                Do
                    size = fs.Read(buf, 0, buf.Length)
                    st.Write(buf, 0, size)
                Loop While size <> 0
                If Not fs Is Nothing Then fs.Close()
                If Not st Is Nothing Then st.Close()

                File.Delete(path)
            End If

        Catch ex As Exception
            Return False

        Finally
            fs = Nothing
            st = Nothing
            req = Nothing

        End Try

        Return True

    End Function



どちらのパターンでもエラーが発生するのは
引用:
req.GetRequestStream()


の箇所です。

解決策や詳しい情報をお持ちの方いらっしゃいませんでしょうか。
RIN
会議室デビュー日: 2004/11/27
投稿数: 5
お住まい・勤務地: 愛知県
投稿日時: 2008-08-07 10:37
VBは知らないのでアレですが、実際の通信内容はチェックしていますか?
パケットをキャプチャするなりしてリクエストデータ、
レスポンスデータとも違いを見てみればどうでしょうか?
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-08-07 14:24
返信ありがとうございます。

引用:
RINさんの書き込み (2008-08-07 10:37) より:
VBは知らないのでアレですが、実際の通信内容はチェックしていますか?
パケットをキャプチャするなりしてリクエストデータ、
レスポンスデータとも違いを見てみればどうでしょうか?


VSのデバッグ機能で上記のチェックしてみようと思ったんですが、ステップ実行するとなぜかエラーが発生しなくなるんです。(つまり通信内容は毎回同じ。)
で、原因はタイミングの問題かと思いGetRequestStreamの前にスリープ処理を入れてその状態で普通に実行したんですが、これでも変わらずエラーが発生するんですよね。。。
もちろんこの状態でステップ実行してもエラーは発生しません。

もうちょっといい通信内容のチェック方法がないか考えてみます。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-08-07 18:36
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39466&forum=7&start=8
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-08-07 20:15
返信ありがとうございます。
引用:
todoさんの書き込み (2008-08-07 18:36) より:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39466&forum=7&start=8


まさにこれです。現象の解決はできました。
自分は何を調べてたんだ。。。申し訳ないです。

.netframeworkのSP1を入れると発生する理由は未だに判りませんが、提示していただいたスレを見て、SP1で通信処理形態に何かしらの変化があったことが予想できます。
MSDN読み漁っていると見つかりそうな気がしてきました。

お手数お掛けしました。
1

スキルアップ/キャリアアップ(JOB@IT)