C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 126 を表示中)
■74767 / )  WebDAVサーバーファイルアップロードのエラー
□投稿者/ DSC渡邊 (4回)-(2015/01/28(Wed) 15:24:15)
DSC渡邊 さんの Web サイト

分類:[VB.NET/VB2005 以降] 

以前、この掲示板でvb.netでWebDAVサーバーに大容量ファイルをアップロードするとエラーになってしまうと質問し、解決したのですが、
サーバーを移動したところ、アップロード処理が正常に動作しないようになってしまいました。


実行すると1〜2分停滞した後、
「基礎になる接続が閉じられました: 受信時に予期しないエラーが発生しました」
という例外エラーが発生してしまいます。

サーバー管理者に確認したところ、サーバーの設定は移動前から変えていないとのことでした。


ソースコードは以下のとおりです
−−−−−−−−−−−−−−−−

            Dim fileToUpload As String = ""
            Dim fileLength As Long = 0
            Dim wIdx As Long = 0
            Dim url As String = ""

            url = サーバーのURL
            fileToUpload = アップロードするファイルのフルパス
            fileLength = My.Computer.FileSystem.GetFileInfo(fileToUpload).Length
            Dim u As New Uri(url)
            Dim host As String = u.Host
            url = url.TrimEnd("/"c) & "/" & サーバーアップロード先フォルダ & IO.Path.GetFileName(fileToUpload)
            Dim request As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
            request.Credentials =  New NetworkCredential(ユーザー名, パスワード)
            request.Method = WebRequestMethods.Http.Put
            request.ContentLength = fileLength
            request.SendChunked = True
            request.Headers.Add("Translate: f")  
            request.AllowWriteStreamBuffering = False
            request.Timeout = 1800000               ''タイムアウト1800秒
            Dim s As IO.Stream = request.GetRequestStream()
            Dim fs As New IO.FileStream(fileToUpload, IO.FileMode.Open, _
                        IO.FileAccess.Read)
            Dim byteTransferRate As Integer = 102400
            Dim bytes(byteTransferRate - 1) As Byte
            Dim bytesRead As Integer = 0
            Dim totalBytesRead As Long = 0
            Do
                bytesRead = fs.Read(bytes, 0, bytes.Length)
                If bytesRead > 0 Then
                    totalBytesRead += bytesRead
                    s.Write(bytes, 0, bytesRead)
                End If
            Loop While bytesRead > 0
            s.Close()
            s.Dispose()
            s = Nothing
            fs.Close()
            fs.Dispose()
            fs = Nothing
            Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
            Dim code As HttpStatusCode = response.StatusCode
            response.Close()
            response = Nothing

−−−−−−−−−−−−−−−−

自分でも、色々と調べたり、設定を変えたりしてみたところ、
「request.SendChunked = True」を「False」に、「request.AllowWriteStreamBuffering = False」を「True」に変更して
実行するとアップロードに成功しました。ただし、大容量(800MBほど)のファイルをアップロードしようとすると処理が停滞し、
タイムアウトエラーとなってしまいました。
※「request.SendChunked = False」の設定をして、「request.AllowWriteStreamBuffering = False」のままだと「この要求には、データのバッファーが必要です。」というエラーになってしまう為、「request.AllowWriteStreamBuffering = False」を「True」にしました。

比較的小さなファイル(50MBや130MB)は10〜数十秒程度で正常にアップロードできました。
ちなみに「CarotDAV」のようなツールソフトだと大容量ファイルも正常にアップロードできました。


何が原因で動作しなくなったのか、分からなくて困っています。教えてほしいのは以下の点です。
@「基礎になる接続が閉じられました: 受信時に予期しないエラーが発生しました」の発生原因の調べ方
A上記の修正内容で大容量のファイルアップロードを成功させる方法があれば教えてほしいです。
B上記以外の修正方法で、アップロードを動作させる方法があれば教えてほしいです。

よろしくお願いします。




返信 編集キー/


管理者用

- Child Tree -