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

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

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

Re[4]: vb.netで大容量ファイルをアップロードするとエラーになる


(過去ログ 125 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■74663 / inTopicNo.1)  vb.netで大容量ファイルをアップロードするとエラーになる
  
□投稿者/ DSC渡邊 (1回)-(2015/01/21(Wed) 18:36:40)

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

vb.netでWebDAVサーバーにファイルをアップロードするプログラムを開発しています。
大容量ファイル(800MBほど)をアップロードしようとしたのですが、「基礎になる接続が閉じられました: 送信時に、予期しないエラーが発生しました。」というエラーが発生してアップロードに失敗しました。

開発環境
Windows7、Visual studio 2010

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

        	   Dim UploadFile As String = ""
        	   Dim fileLength As Long = 0
        	   Dim url As String = WebDAVサーバーのURL
        	   Dim userName As String = 接続ユーザ名
        	   Dim password As String = パスワード

                UploadFile = クライアント側のファイルパス
                fileLength = My.Computer.FileSystem.GetFileInfo(UploadFile).Length
                Dim u As New Uri(url)
                Dim host As String = u.Host
                url = url.TrimEnd("/"c) & "/" & pSvPath & IO.Path.GetFileName(UploadFile)
                Dim request As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
                request.Credentials = New NetworkCredential(userName, password)
                request.Method = WebRequestMethods.Http.Put
                request.ContentLength = fileLength
                request.SendChunked = True
                request.Headers.Add("Translate: f")
                request.AllowWriteStreamBuffering = True
                request.Timeout = 2000000
                Dim s As IO.Stream = request.GetRequestStream()
                Dim fs As New IO.FileStream(UploadFile, IO.FileMode.Open, _
                            IO.FileAccess.Read)
                Dim byteTransferRate As Integer = 4096
                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
−−−−−−−−−−−−−−−−
デバッグで調べると
                Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
の部分でエラーが発生しています。

ちなみに50MBや130MBの比較的小さめのファイルでは正常にアップロードができました。
アップロードするファイルのサイズには制限があるのでしょうか。
もし、あるのならサイズ制限を拡張する方法はないでしょうか。
よろしくお願いします。

引用返信 編集キー/
■74664 / inTopicNo.2)  Re[1]: vb.netで大容量ファイルをアップロードするとエラーになる
□投稿者/ PANG2 (54回)-(2015/01/21(Wed) 18:50:54)
2015/01/21(Wed) 18:51:52 編集(投稿者)

https://support.microsoft.com/kb/908573

他のツールで800MBをPUTできるのですか?
引用返信 編集キー/
■74667 / inTopicNo.3)  Re[2]: vb.netで大容量ファイルをアップロードするとエラーになる
□投稿者/ DSC渡邊 (2回)-(2015/01/22(Thu) 09:44:33)
No74664 (PANG2 さん) に返信
> 2015/01/21(Wed) 18:51:52 編集(投稿者)
>
> https://support.microsoft.com/kb/908573
>
> 他のツールで800MBをPUTできるのですか?

回答ありがとうございます。

「CarotDAV」というツールを使って試したところ、WebDAVサーバーへの800MBのファイルアップロードやダウンロードはできました。
ファイルの内容も問題ありませんでした。

URLリンク先の回避策にあった「HttpWebRequest.AllowWriteStreamBuffering プロパティを false に設定」を試してみましたところ、アップロードには成功しました。
ただ、処理速度が極端に遅くなってしまいました。
(800MBのアップロード完了に二十五分以上かかりました。「CarotDAV」だと数分でした)

なんとか、解決方法がないか、もう少し調査してみます。




引用返信 編集キー/
■74676 / inTopicNo.4)  Re[3]: vb.netで大容量ファイルをアップロードするとエラーになる
□投稿者/ なちゃ (24回)-(2015/01/22(Thu) 13:27:55)
No74667 (DSC渡邊 さん) に返信
> URLリンク先の回避策にあった「HttpWebRequest.AllowWriteStreamBuffering プロパティを false に設定」を試してみましたところ、アップロードには成功しました。
> ただ、処理速度が極端に遅くなってしまいました。
> (800MBのアップロード完了に二十五分以上かかりました。「CarotDAV」だと数分でした)
>
> なんとか、解決方法がないか、もう少し調査してみます。

前のままでもエラーにならないサイズの場合は、もっと早かったということでいいんですよね?
例えば80MBなら2分半よりもずっと早かったなど。

HttpWebRequest.AllowWriteStreamBufferingとかの内部動作がどういう感じになっているのか分かっていないので何とも言えないのですが、バッファリングオフになることでかなり遅くなったということであれば、現在の4096はバイトいう処理単位は小さすぎるのではと推測されます。
例えばこれを、数10キロバイト以上くらいにして、変化は見られないでしょうか?
本当は非同期書き込みしたらもっと効率化できるかも知れませんが、内部動作を把握してないのでほんとに意味があるかは判断できないことと、実装がかなり面倒になるので、取り合えずば処理単位を大きくして試してみてください。
引用返信 編集キー/
■74679 / inTopicNo.5)  Re[4]: vb.netで大容量ファイルをアップロードするとエラーになる
□投稿者/ DSC渡邊 (3回)-(2015/01/22(Thu) 14:37:16)
No74676 (なちゃ さん) に返信
>
> 前のままでもエラーにならないサイズの場合は、もっと早かったということでいいんですよね?
> 例えば80MBなら2分半よりもずっと早かったなど。
>
> HttpWebRequest.AllowWriteStreamBufferingとかの内部動作がどういう感じになっているのか分かっていないので何とも言えないのですが、バッファリングオフになることでかなり遅くなったということであれば、現在の4096はバイトいう処理単位は小さすぎるのではと推測されます。
> 例えばこれを、数10キロバイト以上くらいにして、変化は見られないでしょうか?
> 本当は非同期書き込みしたらもっと効率化できるかも知れませんが、内部動作を把握してないのでほんとに意味があるかは判断できないことと、実装がかなり面倒になるので、取り合えずば処理単位を大きくして試してみてください。

返信ありがとうございます。

HttpWebRequest.AllowWriteStreamBuffering プロパティを Trueに設定していた時のアップロード時間は、
50MBで30秒くらい、130MBで1分20秒くらいでした。

担当者に確認したところ、150MB以上のファイルは滅多にないということなのでファイルサイズによってAllowWriteStreamBuffering プロパティの設定を切り替える仕様にしようかと考えています。

ご指摘のあった4096バイトの処理単位については、試しに40960バイトに変更して実行したところ、800MBのファイルアップロード時間が6分程度と劇的に短縮できました。

おかげでなんとか開発を進められそうです。どうもありがとうございました。




解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -